Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用numba操作列表生成器_Python_Numba - Fatal编程技术网

Python 如何使用numba操作列表生成器

Python 如何使用numba操作列表生成器,python,numba,Python,Numba,我尝试使用一个简单的代码,尝试使用numba和list生成器,执行下面的代码时出现错误 @numba.jit(nopython=True, nogil=True) def perform_search(simple_list, number): gen = (ind for ind in xrange(len(simple_list)) if simple_list[ind] != number) return next(gen) x = [1,1,1,2,1,3] perfo

我尝试使用一个简单的代码,尝试使用numba和list生成器,执行下面的代码时出现错误

@numba.jit(nopython=True, nogil=True)
def perform_search(simple_list, number):
    gen = (ind for ind in xrange(len(simple_list)) if simple_list[ind] != number)
    return next(gen)

x = [1,1,1,2,1,3]
perform_search(x, 1)
当我执行上面的代码时,我得到一个
ValueError
,然而,当我仅仅使用decorator
@numba.jit
时,我得到一个
LoweringError

请帮助我使用generator(或其他)执行此简单搜索。提前谢谢你所拥有的

gen = (ind for ind in xrange(len(simple_list)) if simple_list[ind] != number)
是生成器表达式,numba目前不支持该表达式

如果改用方括号,如:

gen = [ind for ind in xrange(len(simple_list)) if simple_list[ind] != number]
然后是一个列表理解,numba可以支持它。通过该更改,
gen
是一个
列表,您可以对其进行索引(即
gen[0]

编辑:

下面的代码是gitter中用户sklam的建议,我在这里更新

@numba.jit(nopython=True)
def the_gen(simple_list, number):
    for ind in range(len(simple_list)):
        if simple_list[ind] != number:
            yield ind


@numba.jit(nopython=True, nogil=True)
def perform_search(simple_list, number):
    for i in the_gen(simple_list, number):
        print(i)

如果按上述方法操作,则可以使用生成器(这样可以增加内存和时间),因为
numba
当前不支持生成器表达式

我不知道这里发生了什么,但你可能想在邮件列表或gitter聊天中询问:说清楚,你在这里得到的是所谓的a,而不是“列表生成器”。谢谢@sklam。我现在已经在使用你的解决方案了。但是,正如您可以想象的那样,对于大型阵列来说,这种替代方案需要大量的内存(和时间)。您知道numba何时支持生成器吗?根据sklam通过gitter提供的帮助编辑了响应。您可以完全删除生成器,只需让
在enumerate(简单列表)中对ind、val执行
搜索即可:
如果val!=编号:返回ind
?如果
numba
完全消除了索引开销,则保留
xrange
的使用(另外,第二种解决方案应该是
range
xrange
,如果是Py2,
range
需要在前面创建大量不必要的所有索引列表)。是的,谢谢@ShadowRanger,这很有帮助。是的,它必须是xrange而不是range。编辑它。