Почему этот код на Cython медленнее, чем на Python?

Я начинаю изучать Cython из-за проблем с производительностью. Этот конкретный код является попыткой реализовать некоторые новые алгоритмы в транспортном моделировании (для планирования )территории.

Я решил начать с очень простой функции, которую буду использовать МНОГО (сотни миллионов раз )и определенно выиграю от увеличения производительности.

Я реализовал эту функцию тремя разными способами и протестировал их для одного и того же параметра (для простоты )по 10 миллионов раз каждый:

  • Код Cython в модуле cython. Время работы :3,35 с
  • Код Python в модуле Cython. Время работы :4,88 с
  • Код Python на основном скрипте. Время работы :2,98 с

    Как видите, код cython был на 45% медленнее, чем код python в модуле cython, и на 64% медленнее, чем код, написанный на основном скрипте. Как это возможно? Где я делаю ошибку?

Код cython таков:

def BPR2(vol, cap, al, be):
    con=al*pow(vol/cap,be)
    return con


def func (float volume, float capacity,float alfa,float beta):
    cdef float congest
    congest=alfa*pow(volume/capacity,beta)
    return congest

А скрипт для тестирования такой:

agora=clock()
for i in range(10000000):
    q=linkdelay.BPR2(10,5,0.15,4)

agora=clock()-agora
print agora

agora=clock()
for i in range(10000000):
    q=linkdelay.func(10,5,0.15,4)

agora=clock()-agora
print agora

agora=clock()
for i in range(10000000):
    q=0.15*pow(10/5,4)

agora=clock()-agora
print agora

Я знаю о таких проблемах, как трансцендентные функции (power ), которые работают медленнее, но я не думаю, что это должно быть проблемой.

Поскольку поиск функции в функциональном пространстве сопряжен с накладными расходами, поможет ли это производительности, если я передам массив для функции и верну массив? Могу ли я вернуть массив с помощью функции, написанной на Cython?

Для справки я использую: -Виндовс 7 64бит -Python 2.7.3 64 бита -Cython 0.16 64 бита -Windows Visual Studio 2008

12
задан agf 25 June 2012 в 18:03
поделиться