Python代码中的Cython代码
有几种将Cython与Python结合使用的方法Python代码中的Cython代码,python,cython,Python,Cython,有几种将Cython与Python结合使用的方法 第一个版本(标准):编写Cython代码mylib.pyx,然后运行此setup.py: 从distutils.core导入设置 来自Cython.Build导入cythonize setup(ext\u modules=cythonize(“mylib.pyx”)) 这将它编译成一个.pyd文件,然后在主myprogram.py中执行导入mylib 这是与Cython合作的标准方式 第二个版本(“动态编译,使用pyximport”): 编写m
- 第一个版本(标准):编写Cython代码
,然后运行此mylib.pyx
:setup.py
从distutils.core导入设置
来自Cython.Build导入cythonize
这将它编译成一个setup(ext\u modules=cythonize(“mylib.pyx”))
文件,然后在主.pyd
中执行myprogram.py
这是与Cython合作的标准方式导入mylib
- 第二个版本(“动态编译,使用
”): 编写pyximport
,并且不需要任何setup.py,只需在主Python代码中执行此操作:mylib.pyx
导入pyximport;pyximport.install()
就这样!编译将在Python程序启动时进行导入mylib
@cython.locals(a=cython.double, b=cython.double)
def foo(a, b):
return a + b
第三种方法是在IPython笔记本中使用cythonmagic(请参阅)。显然,这是为了交互使用而设计的,这可能不是您想要的 如果查看它的功能(源代码在其中),它会在当前工作目录中创建一个.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\u inline),并且看起来确实需要文档化,还推荐'cython.compile',它可以用作编译单个函数的装饰程序(虽然您不能在该函数中使用任何非python关键字。使用PyXimPort时有些东西不起作用。它是否与使用我的问题的第1或第2个版本完全相同,即,该代码将在启动时编译,然后执行得非常快?更一般地说,这是否与普通Cython代码一样快(初始编译时间除外)?这相当于在
.pyx
文件中使用cdef
。生成的代码没有区别。使用-a
标志生成html并自己比较两个版本。我应该将-a
html放在哪里,真的吗?
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 }