Ich versuche zu verstehen, wie der @ jitclass-Dekorator mit verschachtelten Klassen arbeitet. Ich habe zwei Dummy-Klassen geschrieben: fifi und toto fifi hat ein Toto-Attribut. Beide Klassen haben den @ jitclass-Dekorator, aber die Kompilierung schlägt fehl. Hier ist der Code:Wie numba jitclass verschachteln
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
Das Skript, das den Code startet:
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])
Als ich das Skript ausführen, ich get [...]
TypingError: Untyped global name 'toto' File "fifi.py", line 11
Beachten Sie, dass, wenn ich einen Verweis auf "Toto" in "FFi" entfernen, der Code funktioniert und ich eine x16-Geschwindigkeit dank numba erhalten.