Я знаю, что это старый вопрос, но этот вопрос возникает в Google, когда вы ищете что-то подобное ctypes vs cython
, и большинство ответов здесь написаны теми, кто уже владеет знаниями, cython
или c
которые могут не отражать фактического времени, которое вам нужно было потратить, чтобы изучить эти вопросы. реализовать ваше решение. Я полный новичок в обоих. Я никогда не трогал cython
раньше, и у меня очень мало опыта c/c++
.
В течение последних двух дней я искал способ делегировать часть моего кода, требующую высокой производительности, на более низкий уровень, чем python. Я реализовал свой код в ctypes
и Cython
, который состоял в основном из двух простых функций.
У меня был огромный список строк, которые нужно обработать. Обратите внимание list
и string
. Оба типа не полностью соответствуют типам in c
, потому что строки python по умолчанию являются юникодом, а c
строки - нет. Списки в python просто НЕ являются массивами c.
Вот мой вердикт. Использование cython
. Он более свободно интегрируется с python и с ним легче работать. Если что-то идет не так, ctypes
просто выдает вам segfault, по крайней мере cython
, когда это возможно, вы получите предупреждения о компиляции с трассировкой стека, и вы можете легко вернуть действительный объект python с помощью cython
.
Вот подробный отчет о том, сколько времени мне нужно было потратить на то и другое, чтобы реализовать одну и ту же функцию. Кстати, я очень мало занимался программированием на C / C ++:
Ctypes:
- Около 2 часов на изучение того, как преобразовать мой список строк Unicode в AC совместимый тип.
- Около часа, как правильно вернуть строку из функции ac. Здесь я фактически предоставил свое собственное решение для SO, как только я написал функции.
- Около получаса, чтобы написать код на c, скомпилировать его в динамическую библиотеку.
- 10 минут, чтобы написать тестовый код на python, чтобы проверить,
c
работает ли код.
- Около часа выполнения некоторых тестов и реорганизации
c
кода.
- Затем я вставил
c
код в реальную базу кода и увидел, что ctypes
он плохо работает с multiprocessing
модулем, так как его обработчик по умолчанию не выбирается.
- Около 20 минут я переставил свой код, чтобы не использовать
multiprocessing
модуль, и повторил попытку.
- Затем вторая функция в моем
c
коде генерировала ошибки в моей кодовой базе, хотя и прошла тестовый код. Ну, это, наверное, моя вина, что я плохо проверил крайние случаи, я искал быстрое решение.
- Примерно 40 минут я пытался определить возможные причины этих ошибок.
- Я разделил свои функции на две библиотеки и попробовал снова. Все еще были segfaults для моей второй функции.
- Я решил отпустить вторую функцию и использовать только первую функцию
c
кода, и на второй или третьей итерации цикла python, который ее использует, у меня была UnicodeError
мысль не декодировать байт в некоторой позиции, хотя я кодировал и декодировал все явно.
На данный момент, я решил искать альтернативу и решил изучить cython
:
- Cython
- 10 минут чтения Cython Hello World .
- 15 минут проверки SO о том, как использовать Cython
setuptools
вместо distutils
.
- 10 минут чтения на типах и типах. Я узнал, что могу использовать большинство встроенных типов Python для статической типизации.
- 15 минут для повторного добавления кода Python с типами Cython.
- 10 минут модификации
setup.py
для использования скомпилированного модуля в моей кодовой базе.
- Подключил модуль непосредственно к
multiprocessing
версии кодовой базы. Оно работает.
Для справки, я, конечно, не измерил точные сроки моих инвестиций. Вполне возможно, что мое восприятие времени было немного внимательным из-за умственных усилий, которые требовались, когда я имел дело с ctypes. Но это должно передать чувство борьбы cython
иctypes