Может ли Cython ускорить итерацию массива объектов?

Я хочу ускорить следующий код с помощью 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?

9
задан Maxim 21 October 2010 в 03:14
поделиться