Различия между Cython, расширением C/C++ с помощью Python.h и т. д.

Прямо сейчас у меня есть алгоритм обработки изображений, который составляет примерно 100 строк или около того на Python. При использовании numpy, PIL и scipy требуется около 500 мс. Я хочу сделать это быстрее, и, поскольку фактический алгоритм кажется довольно оптимизированным, мне интересно, улучшит ли время использование другого подхода, такого как Cython. Я считаю, что у меня есть несколько разных вещей, которые я мог бы сделать:

  1. Используйте Cython, чтобы предоставить Python соответствующие части библиотеки C.
  2. Используйте Ctypes, чтобы просто писать все на C, но при этом иметь чистый Python (совсем не склоняясь к этому)
  3. Создайте модуль расширения в C/C++, а затем импортируйте его и вызовите функции. Я не уверен, смогу ли я использовать numpy таким образом.
  4. Создайте DLL и попросите Python загрузить ее. Это не позволяет использовать numpy или эти модули, но все равно будет очень эффективным.

Я просто ищу здесь скорость, не беспокоясь о сложности реализации. Есть ли какой-то один вариант, который лучше в данном случае, они все одинаковые или вообще стоит делать?


person Chrispresso    schedule 08.06.2016    source источник


Ответы (1)


Это помогает знать, что вам нужно сделать здесь.

Если вы не используете ctypes для вызовов функций, маловероятно, что это сэкономит вам что-либо, просто задействовав ctypes типы. Если у вас уже есть какая-то DLL с функцией "решить это для меня", то, конечно, ctypes это так.

Cython создает модули расширения, поэтому все, что вы можете делать с Cython, можно сделать и с помощью модуля расширения, все зависит только от того, насколько удобно вы пишете расширения вручную. Cython более ограничен, чем написание расширения вручную, и труднее «увидеть» производительность (правила оптимизации Cython в основном противоположны оптимизации кода CPython, и если вы забудете cdef правильные вещи, вы ничего не получите), но Cython в общем тоже проще.

Написание отдельной библиотеки DLL без расширения имеет смысл только в том случае, если вы используете ее не в Python; в противном случае расширение Python в основном просто случай DLL, но лучше интегрировано.

По сути, по определению, с бесконечным временем и навыками расширение CPython превзойдет любой другой вариант по производительности, поскольку оно может делать все, что делают другие, и даже больше. Это просто больше работы и легко сделать ошибки (потому что вы пишете C, который подвержен ошибкам).

person ShadowRanger    schedule 08.06.2016