2016-07-31 15 views
6

घोंसला कैसे करें मैं समझने की कोशिश कर रहा हूं कि @jitclass सजावट नेस्टेड कक्षाओं के साथ कैसे काम करता है। मैंने दो डमी कक्षाएं लिखी हैं: फीफी और टोटो फीफी में एक टोटो विशेषता है। दोनों वर्गों में @jitclass सजावट है लेकिन संकलन विफल रहता है। कोड यह रहा:कैसे numba 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

ध्यान दें कि अगर मैं 'फीटी' में 'toto' के किसी भी संदर्भ को हटा देता हूं, तो कोड ठीक काम करता है और मुझे x16 गति मिलती है धन्यवाद।

उत्तर

5

किसी अन्य जिटलक्लास के सदस्य के रूप में एक जेटक्लास का उपयोग करना संभव है, हालांकि ऐसा करने का तरीका अच्छी तरह से प्रलेखित नहीं है। आपको deferred_type उदाहरण का उपयोग करने की आवश्यकता है। यह नुंबा 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 उदाहरण में से कुछ में देखा जा सकता है, उदाहरण के लिए:

संबंधित मुद्दे