2012-05-04 2 views
2

У меня есть программа в python, использующая numpy и scipy. добавление Cython в нем будет время процесс принятия, поскольку есть много изменений типов данныхстоит ли переписывать мой код в cython?

Cprofile этого выглядит следующим образом: http://imgur.com/a/Sgvof

Большую часть времени (73%) расходуется на <scipy.integrate_odepack.odeint> Мой вопрос в основном заключается в том, что использование cython ускоряет эту функцию (возможно, путем быстрого вызова) и остальное. Эта функция называется ~ 10^6 раз в этом примере. И если да, то сколько можно ускорить? Я считаю, если это преследует увеличения скорости по крайней мере 4x 5х

Примечание:

Если информация является недостаточной, пожалуйста, комментарий ниже, и я был бы рад предоставить

Спасибо

ответ

3

Ну, половина времени <scipy.integrate_odepack.odeint> находится в пределах dx_dv и dx_du, они выглядят как функции python. Это функции, которые вы можете настроить, особенно если они сложны.

Одна вещь иметь в виду, что если замедление происходит только из-за calling overhead * number of calls, тогда я не ожидал, что ситуация улучшится. Эти накладные расходы не исчезнут, на самом деле это может быть сложнее. Вместо SciPy C -> Python вы будете делать SciPy C -> Python -> ваш C.

+0

+1 для первого абзаца. Однако вызывающая последовательность Fortran (не C!) -> Python -> C не обязательно медленнее, чем Fortran -> Python. –

+0

на самом деле, посмотрите изображение снова ... 'dX_dv' и' dX_du' являются функциями внутри его файла 'GRScalar.py'. '' не имеет ничего общего с этими функциями ... поскольку они являются тем, что OP вызывает ... Конечно, наличие образца исходного кода, который использует эти методы, сильно прояснит, что это происходит. – g19fanatic

+0

@ g19fanatic: Я не знаком с этим профилировщиком, но я понял, что 'dX_dv' вызывается' odeint' и считается, что это обратный вызов OP. –

3

Скорее всего, вы не увидите улучшения (если есть). SciPy (и даже более конкретный код, который вас больше всего интересует, odeint) уже является модулем CPython (написанным на языке Fortran), а не только питоном.

Если это был вызов функции только для python, то запись его в Cython (что может быть проще, чем писать полный модуль CPython, хотя я лично пишу ac или C++ dll и вызываю его с помощью ctypes ...) увеличит вашу производительность. Но, вероятно, не в этой ситуации.

Смежные вопросы