【问题标题】:Add variable types in .pyx file (Python)在 .pyx 文件中添加变量类型(Python)
【发布时间】:2014-09-20 16:43:01
【问题描述】:

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

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

【问题讨论】:

    标签: python types cython


    【解决方案1】:

    首先你需要告诉 cython 这个变量将获得一个带有cdef 的静态类型。其次,您试图将数组分配给单个浮点变量。您必须使用与 numpy 数组兼容的类型。 Numpy 有一个 C 后端,它定义了可以在 Cython 中使用的数组类型。为数组声明类型的正确方法是。

    cimport numpy as np
    cdef np.ndarray[np.double_t] a = np.zeros(len(b))
    

    多个字符串在 C 中保存在数组中。单个char 变量只能保存一个字母。在Cython tutorial有一个页面如何处理cython中的python字符串

    【讨论】:

      【解决方案2】:

      你需要使用cdef:

      cdef char word
      c = 'pref'
      cdef int i,b etc..
      

      如果您查看您链接到的那些文档:

      Python 函数调用可能很昂贵——在 Cython 中加倍如此,因为可能需要在 Python 对象之间进行转换才能进行调用。在我们上面的例子中,参数在 f() 和对它的调用中都被假定为一个 C 的 double 类型,但是为了传递它,必须在参数周围构造一个 Python 浮点对象。 因此 Cython 提供了一种用于声明 C 风格函数的语法,即 cdef 关键字:

      cdef double f(double x) except? -2:
          return x**2-x
      

      【讨论】:

      • 或cpdef,视需要而定。
      • @WilliamMcBrine,是的,这取决于你想做什么
      猜你喜欢
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      • 2023-01-29
      • 1970-01-01
      相关资源
      最近更新 更多