2015-05-14 3 views
4

Существует несколько способов использования Cython с Python.Код Cython внутри кода Python

  • Первая версия (стандарт): вы пишете код Cython mylib.pyx, то вы запустите этот setup.py:

    from distutils.core import setup
    from Cython.Build import cythonize
    setup(ext_modules = cythonize("mylib.pyx"))

    , который компилирует его в .pyd файл и затем, в основном myprogram.py, вы делаете import mylib.

    Это стандартный способ работы с Cython.

  • Вторая версия («на лету компиляции, с pyximport»):

    Вы пишете mylib.pyx, и вы не нужно любой setup.py, вы просто делаете это в основном Python код:

    import pyximport; pyximport.install()
    import mylib

    Вот оно! Компиляция будет выполняться «на лету» при запуске программы Python!

Вопрос:

Есть ли "третий вариант" ("легче на лету компиляции"):

# myprogram.py 

import pyximport 
pyximport.compile(""" 
     # Here is directly the Cython code inserted in the main Python code 
     def mycythonfunction(int a, int b): 
      cdef int i, j, 
     ... 
     """) 

res = mycythonfunction(3, 2) 

т.е. с кодом Cython непосредственно вставленной в основной Python код?

+0

Есть некоторые вещи, которые не работают с использованием pyximport –

ответ

2

pure Python mode позволяет использовать декоратор для замедления типа. Вы можете использовать тот же источник с чистым Python и с Cython.

Например:

@cython.locals(a=cython.double, b=cython.double) 
def foo(a, b): 
    return a + b 
+0

Будет ли это быть точно sa я как использую 1-й или 2-й вариант моего вопроса, т. е. этот код будет скомпилирован при запуске, а затем выполнен очень быстро? В более общем плане, это так же быстро, как и обычный Cython-код (кроме начального времени компиляции)? – Basj

+0

Это эквивалентно использованию 'cdef' в файлах' .pyx'. В сгенерированном коде нет разницы. Используйте флаг '-a', чтобы генерировать html и сравнивать обе версии самостоятельно. –

+0

Где я должен положить '-a'? HTML, действительно? – Basj

2

Третий способ заключается в использовании cythonmagic в IPython ноутбука (см http://docs.cython.org/src/quickstart/build.html#using-the-ipython-notebook). Очевидно, что это предназначено для интерактивного использования, которое может быть не таким, каким вы хотите.

Если вы посмотрите, что он делает (исходный код находится в https://github.com/cython/cython/tree/master/Cython/Build), он создает .pyx-файл в текущем рабочем каталоге с «случайным» именем на основе md5hash, а затем использует pyximport для импорта этого модуля. (Он также вмешивается с местными жителями и глобальными кругами, чтобы обеспечить их сохранность).

Вы можете получить доступ к этому механизму самостоятельно, хотя Cython.Build.Inline. (Я подозреваю, что это не значит, что это открытый интерфейс, поэтому он может неожиданно измениться).Пример:

from Cython.Build import Inline 
Inline.cython_inline("""a=5 
print a""",locals={},globals={}) 

# prints a bunch of lines about what it's compiling 
# prints 5 
# returns a dictionary of {'a'=5 } 

Edit:

я рекомендовал 'cython.inline' (который только направляет Cython.Build.Inline.compile_inline) и не смотреть быть документированной, а также 'cython.compile', который можно использовать в качестве декоратора для компиляции отдельной функции (хотя вы не можете использовать ключевые слова, отличные от python, в этой функции.

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