在.pyx文件中添加变量类型(Python)

时间:2014-07-29 10:26:42

标签: python types cython

我正在尝试使用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'

现在这不起作用。我无法运行或编译它。那么如何在函数内部添加变量类型呢?

2 个答案:

答案 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字符串

相关问题