gpt4 book ai didi

python - 如何嵌套numba jitclass

转载 作者:太空狗 更新时间:2023-10-29 20:13:41 25 4
gpt4 key购买 nike

我正在尝试了解 @jitclass 装饰器如何与嵌套类一起工作。我写了两个虚拟类:fifi 和 totofifi 有一个 toto 属性。这两个类都有 @jitclass 装饰器,但编译失败。这是代码:

fifi.py

from numba import jitclass, float64
from toto import toto

spec = [('a',float64),('b',float64),('c',toto)]

@jitclass(spec)
class fifi(object):
def __init__(self, combis):
self.a = combis
self.b = 2
self.c = toto(combis)

def mySqrt(self,x):
s = x
for i in xrange(self.a):
s = (s + x/s) / 2.0
return s

toto.py:

from numba import jitclass,int32

spec = [('n',int32)]

@jitclass(spec)
class toto(object):
def __init__(self,n):
self.n = 42 + n

def work(self,y):
return y + self.n

启动代码的脚本:

from datetime import datetime
from fifi import fifi
from numba import jit

@jit(nopython = True)
def run(n,results):
for i in xrange(n):
q = fifi(200)
results[i+1] = q.mySqrt(i + 1)

if __name__ == '__main__':
n = int(1e6)
results = [0.0] * (n+1)
starttime = datetime.now()
run(n,results)
endtime = datetime.now()

print("Script running time: %s"%str(endtime-starttime))
print("Sqrt of 144 is %f"%results[145])

当我运行脚本时,我得到 [...]

TypingError: Untyped global name 'toto' File "fifi.py", line 11

请注意,如果我删除了“fifi”中对“toto”的任何引用,代码可以正常工作,而且由于 numba,我的速度提高了 16 倍。

最佳答案

可以将一个 jitclass 用作另一个 jitclass 的成员,尽管没有很好地记录这样做的方法。您需要使用 deferred_type 实例。这适用于 Numba 0.27 或更早版本。将 fifi.py 更改为:

from numba import jitclass, float64, deferred_type
from toto import toto

toto_type = deferred_type()
toto_type.define(toto.class_type.instance_type)

spec = [('a',float64),('b',float64),('c',toto_type)]

@jitclass(spec)
class fifi(object):
def __init__(self, combis):
self.a = combis
self.b = 2
self.c = toto(combis)

def mySqrt(self,x):
s = x
for i in xrange(self.a):
s = (s + x/s) / 2.0
return s

然后我得到输出:

$ python test.py
Script running time: 0:00:01.991600
Sqrt of 144 is 12.041595

这个功能可以在一些更高级的jitclass数据结构的例子中看到,例如:

关于python - 如何嵌套numba jitclass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38682260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com