Je veux accélérer le code suivant à l'aide cython:Cython peut-il accélérer le tableau d'itérations d'objets?
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
La seule chose qui vient à l'esprit est quelque chose comme ceci:
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
Fondamentalement, la solution en C++ sera d'avoir gamme des pointeurs vers une classe de base avec la méthode virtuelle fun()
, alors vous pouvez parcourir rapidement. Y a-t-il un moyen de le faire en utilisant python/cython? BTW: Serait-il plus rapide d'utiliser le tableau 2D de numpy avec dtype = object_, plutôt que des listes python?
Essayez les 2 boucles dérouler internes, les nombres sont petits, donc il ne sera pas ajouter du code beaucoup plus. Je pense qu'il y a de bonnes chances que cela puisse aider. –
Ceci est juste un exemple, dans le code réel, une taille est grande et connue seulement à l'exécution – Maxim