Python代码中的Cython代码

时间:2015-05-14 14:08:28

标签: python cython

有几种方法可以将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代码中?

2 个答案:

答案 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关键字。