Я знаю, что это старый вопрос, но этот вопрос возникает в 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