我正在尝试使用Cython编译模块,以加快速度。
加速并不错,但Cython的教程指出使用静态类型时可能会更好(参见http://docs.cython.org/src/quickstart/cythonize.html#determining-where-to-add-types)。
现在我使用了
cython -a myscript.pyd
命令以查看添加类型的好处,并且在任何地方我声明变量几乎代码行以黄色突出显示,表示我可能在那里添加变量类型。
我遇到的问题是,似乎只能在函数内执行此操作。例如,代码中的一些黄色突出显示的行是
a = np.zeros(len(b))
word = 'pref'
所以在.pyx文件中我将其更改为
float a = np.zeros(len(b))
char word = 'pref'
现在这不起作用。我无法运行或编译它。那么如何在函数内部添加变量类型呢?
答案 0 :(得分:2)
您需要使用cdef
:
cdef char word
c = 'pref'
cdef int i,b etc..
我看看你链接到的那些文档:
Python函数调用可能很昂贵 - 在Cython中是双倍的,因为可能需要转换为Python对象和从Python对象进行调用。在上面的示例中,假定参数在f()内部和调用它时都是C double,但是必须围绕参数构造Python float对象才能传递它。 因此,Cython提供了一种声明C风格函数的语法,即cdef关键字:
cdef double f(double x) except? -2:
return x**2-x
答案 1 :(得分:1)
首先,你需要告诉cython这个变量将获得一个cdef
的静态类型。其次,您尝试将数组分配给单个float变量。您必须使用与numpy数组兼容的类型。 Numpy有一个C-backend,它定义了可以在Cython中使用的数组类型。为数组声明类型的正确方法是。
cimport numpy as np
cdef np.ndarray[np.double_t] a = np.zeros(len(b))
多字符串以C格式保存在数组中。单个char
变量只能容纳一个字母。 Cython tutorial中有一个页面如何处理cython中的python字符串