如何嵌套numba jitclass

ma3*_*oun 9 python jit numba

我试图理解@jitclass装饰器如何与嵌套类一起工作.我写了两个虚拟类:fifi和toto fifi有一个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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

启动代码的脚本:

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])
Run Code Online (Sandbox Code Playgroud)

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

TypingError:Untyped全局名称'toto'文件"fifi.py",第11行

请注意,如果我删除'fifi'中对'toto'的任何引用,代码工作正常,由于numba,我的速度提高了x16.

Jos*_*del 15

可以使用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
Run Code Online (Sandbox Code Playgroud)

然后我得到输出:

$ python test.py
Script running time: 0:00:01.991600
Sqrt of 144 is 12.041595
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,只有自引用类才需要使用延迟机制,例如示例中的链接实现。您可以直接在 jitclass 规范中使用“toto.class_type.instance_type”,即:“spec = [('a',float64), ('b',float64), ('c',toto.class_type.实例类型)]`。来自 /sf/ask/4034802761/ (3认同)