Python代码中的Cython代码

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与Python结合使用的方法

  • 第一个版本(标准):编写Cython代码
    mylib.pyx
    ,然后运行此
    setup.py

    从distutils.core导入设置
    
    来自Cython.Build导入cythonize

    setup(ext\u modules=cythonize(“mylib.pyx”))

    这将它编译成一个
    .pyd
    文件,然后在主
    myprogram.py
    中执行
    导入mylib

    这是与Cython合作的标准方式

  • 第二个版本(“动态编译,使用
    pyximport
    ”):

    编写
    mylib.pyx
    ,并且不需要任何setup.py,只需在主Python代码中执行此操作:

    导入pyximport;pyximport.install()

    导入mylib

    就这样!编译将在Python程序启动时进行

问题: 是否有“第三个版本”(“更容易即时编译”):

i、 e.通过将Cython代码直接插入到主Python代码中?

允许使用修饰符进行类型减速。 您可以将同一源代码用于纯Python和Cython

例如:

@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 }