Я хочу ускорить следующий код с помощью 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
По сути, решение в C ++ будет заключаться в том, чтобы иметь массив указателей на некоторый базовый класс с виртуальным методом fun ()
, тогда вы можете довольно быстро перебирать его. Есть ли способ сделать это с помощью python / cython?
Кстати: было бы быстрее использовать 2D-массив numpy с dtype = object_ вместо списков python?