Python numba的合作项目

Python numba的合作项目,python,coroutine,numba,Python,Coroutine,Numba,我正在做一些需要快速协作的事情,我相信numba可以加快我的代码速度 这里有一个愚蠢的例子:一个函数将其输入平方,并将其被调用的次数相加 def make_square_plus_count(): i = 0 def square_plus_count(x): nonlocal i i += 1 return x**2 + i return square_plus_count 您甚至不能nopython=FalseJIT此

我正在做一些需要快速协作的事情,我相信numba可以加快我的代码速度

这里有一个愚蠢的例子:一个函数将其输入平方,并将其被调用的次数相加

def make_square_plus_count():
    i = 0
    def square_plus_count(x):
        nonlocal i
        i += 1
        return x**2 + i
    return square_plus_count
您甚至不能
nopython=False
JIT此操作,这可能是由于
非本地关键字造成的

但如果使用类,则不需要
非本地

def make_square_plus_count():
    @numba.jitclass({'i': numba.uint64})
    class State:
        def __init__(self):
            self.i = 0

    state = State()

    @numba.jit()
    def square_plus_count(x):
        state.i += 1
        return x**2 + state.i
    return square_plus_count
这至少是可行的,但如果您执行
nopython=True
,它就会中断


是否有一种解决方案可以使用
nopython=True
编译?

如果要使用状态类,也可以使用方法而不是闭包(不应编译python):

然而,计时显示,这实际上比纯python闭包实现慢。我认为,只要您不使用
非局部
numpy数组,或者在方法(或闭包)中对数组执行操作,那么效率就会降低

我怎样才能
检查类型()
你的
状态。平方加上计数
?我已经四处查看了一下,发现我或多或少地说这是不可能的。
import numba

@numba.jitclass({'i': numba.uint64})
class State(object):
    def __init__(self):
        self.i = 0

    def square_plus_count(self, x):
        self.i += 1
        return x**2 + self.i

square_with_call_count = State().square_plus_count  # using the method
print([square_with_call_count(i) for i in range(10)])
# [1, 3, 7, 13, 21, 31, 43, 57, 73, 91]