Я начинаю изучать 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
Я знаю, что трансцендентные функции (мощность) работают медленнее, но я не думаю, что это должно быть проблемой.
Поскольку поиск функции в функциональном пространстве связан с дополнительными расходами, поможет ли производительность, если я передам массив для функции и получу массив обратно? Могу ли я вернуть массив с помощью функции, написанной на Cython?
Для справки я использую:
- Windows 7 64-битная
- Python 2.7.3 64 бит
- Cython 0.16 64 бит
- Windows Visual Studio 2008
PyObject*
в число с плавающей запятой, а затем обратно, не так ли? Похоже, для такой маленькой функции много накладных расходов. - person Voo   schedule 25.06.2012double
вместоfloat
? - person K. Brafford   schedule 03.07.2012