Ich möchte den folgenden Code verwenden cython beschleunigen:Kann Cython das Array der Objektiteration beschleunigen?
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
Das einzige, was in den Sinn kommt, ist so etwas wie dieses:
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
Grundsätzlich wird die Lösung in C++ sein Array haben von Zeigern auf einige Basisklasse mit der virtuellen Methode fun()
, dann könnten Sie ziemlich schnell durchlaufen. Gibt es eine Möglichkeit, dies mit Python/Cython zu tun?
BTW: Wäre es schneller, numpys 2D-Array mit dtype = object_ anstelle von Python-Listen zu verwenden?
Versuchen sie es mit Abrollen der 2 inneren Schleifen entfernt werden konnten, sind die Zahlen klein, so dass es viel mehr Code nicht hinzufügen. Ich denke, dass es eine gute Chance gibt, dass numpy hilft. –
Dies ist nur ein Beispiel, in realen Code eine Größe ist groß und nur zur Laufzeit bekannt – Maxim