有几种方法可以将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 :(得分:2)
pure Python mode允许使用装饰器进行类型减速。 您可以使用纯Python和Cython使用相同的源。
例如:
@cython.locals(a=cython.double, b=cython.double)
def foo(a, b):
return a + b
答案 1 :(得分:2)
第三种方法是在IPython笔记本中使用cythonmagic(参见http://docs.cython.org/src/quickstart/build.html#using-the-ipython-notebook)。显然,这些设计是为了交互使用,这可能不是你想要的。
如果查看它的作用(源代码在https://github.com/cython/cython/tree/master/Cython/Build中),它会在当前工作目录中使用" random"创建一个.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 }
修改强>:
我应该推荐' cython.inline' (它只是转发到Cython.Build.Inline.compile_inline)并且确实需要记录,并且还有' cython.compile'它可以用作装饰器来编译单个函数(尽管你不能在该函数中使用任何非python关键字。