Как убрать утверждение Python при компиляции в Cython? - PullRequest
6 голосов
/ 26 ноября 2010

Итак, вот моя проблема: я пишу на python, но мне нужно улучшить производительность в некоторых частях моего кода, которые слишком медленные.Хорошее (и простое) решение, похоже, использует Cython;Я попробовал это и получил хорошие результаты.Проблема заключается в том, что я использую утверждение assert в своем коде Python.Прежде чем использовать cython, я мог бы скомпилировать свой код на python с опцией -OO, чтобы я мог предоставить версию, не выполняющую никакой проверки утверждения, и при этом иметь утверждение для отладки.Но файлы, скомпилированные в cython, похоже, всегда выполняют утверждения.Есть ли какие-то опции, которые можно передать компиляции Cython, чтобы удалить (или не удалить) утверждения?

Ответы [ 2 ]

10 голосов
/ 26 ноября 2010

Cython пропускает утверждения, если вы определяете макрос препроцессора C PYREX_WITHOUT_ASSERTIONS. Поэтому передайте -DPYREX_WITHOUT_ASSERTIONS компилятору C при компиляции сгенерированного файла C. Как это зависит от вашего процесса сборки.

0 голосов
/ 16 марта 2011

Использование pypreprocessor

Который также можно найти в PYPI (индекс пакета Python) и получить с помощью pip.

Вот реализация:

from pypreprocessor import pypreprocessor

pypreprocessor.parse()

#define debug

#ifdef debug
...place assert to be removed here...
#endif

По сути, это работает так же, как стандартная условная компиляция препроцессора C.

SideNote: этот модуль совместим как с python2x, так и с python3k.

Отказ от ответственности: я являюсь автором pypreprocessor.

Это сделает начальную загрузку более длительной из-за добавленной стадии препроцессора, но выводимый байт-код (.pyc) будет оптимизирован.

...