2010-10-21 5 views
7

मैं cython का उपयोग कर निम्न कोड में तेजी लाने के लिए चाहते हैं:क्या साइथन ऑब्जेक्ट पुनरावृत्ति की सरणी को गति दे सकता है?

class A(object): 
    cdef fun(self): 
     return 3 


class B(object): 
    cdef fun(self): 
     return 2 

def test(): 
    cdef int x, y, i, s = 0 
    a = [ [A(), B()], [B(), A()]] 
    for i in xrange(1000): 
     for x in xrange(2): 
      for y in xrange(2): 
       s += a[x][y].fun() 
    return s 

केवल एक चीज है जो मन में आता कुछ इस तरह है:

def test(): 
    cdef int x, y, i, s = 0 
    types = [ [0, 1], [1, 0]] 
    data = [[...], [...]] 
    for i in xrange(1000): 
     for x in xrange(2): 
      for y in xrange(2): 
       if types[x,y] == 0: 
        s+= A(data[x,y]).fun() 
       else: 
        s+= B(data[x,y]).fun() 
    return s 

असल में, सी ++ में समाधान सारणी रखने के लिए किया जाएगा आभासी विधि fun() के साथ कुछ बेस क्लास के पॉइंटर्स के लिए, तो आप इसे बहुत तेज़ी से पुन: सक्रिय कर सकते हैं। क्या पाइथन/साइथन का उपयोग करने का कोई तरीका है?

बीटीडब्ल्यू: क्या पाइथन सूचियों के बजाय, dtype = object_ के साथ numpy's 2D सरणी का उपयोग करना तेज़ होगा?

+0

2 भीतरी छोरों unrolling प्रयास करें हटाया जा सकता, संख्या, छोटे हैं तो यह भी बहुत कुछ कोड में शामिल नहीं होगा। मुझे लगता है कि एक अच्छा मौका है कि numpy मदद करेगा। –

+0

यह एक उदाहरण है, वास्तविक कोड में एक आकार बड़ा है और केवल रनटाइम – Maxim

उत्तर

5

लग रहा है इस तरह कोड 20x के बारे में speedup देता है जैसे:

import numpy as np 
cimport numpy as np 
cdef class Base(object): 
    cdef int fun(self): 
     return -1 

cdef class A(Base): 
    cdef int fun(self): 
     return 3 


cdef class B(Base): 
    cdef int fun(self): 
     return 2 

def test(): 
    bbb = np.array([[A(), B()], [B(), A()]], dtype=np.object_) 
    cdef np.ndarray[dtype=object, ndim=2] a = bbb 

    cdef int i, x, y 
    cdef int s = 0 
    cdef Base u 

    for i in xrange(1000): 
     for x in xrange(2): 
      for y in xrange(2): 
       u = a[x,y]     
       s += u.fun() 
    return s 

यह भी चेक, कि ए और बी बेस से लिए गए हैं, शायद वहाँ रिलीज में उसे निष्क्रिय करने के लिए रास्ता बनाता है और अतिरिक्त speedup

हो जाता है

संपादित करें: चेक का उपयोग कर

u = <Base>a[x,y] 
+2

पर जाना जाता है क्या कोई कारण है कि आप ऑब्जेक्ट को किसी सूची या अन्य डेटा संरचना के बजाय एक numpy array में संग्रहीत करते हैं? – Zephyr

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