【发布时间】:2014-01-07 14:20:40
【问题描述】:
考虑一下这个虚拟的 Cython 代码:
#!python
#cython: boundscheck=False
#cython: wraparound=False
#cython: initializedcheck=False
#cython: cdivision=True
#cython: nonecheck=False
import numpy as np
# iterator function
cdef double[:] f(double[:] data):
data[0] *= 1.01
data[1] *= 1.02
return data
# looping function
cdef double[:] _call_me(int bignumber, double[:] data):
cdef int ii
for ii in range(bignumber):
data = f(data)
return data
# helper function to allow calls from Python
def call_me(bignumber):
cdef double[:] data = np.ones(2)
return _call_me(bignumber, data)
现在,如果我对此执行 cython -a,它会以黄色显示返回语句。我在一个对性能非常关键的程序中做类似的事情,根据分析,这真的减慢了我的代码。那么,为什么 cython 需要 python 来处理这些返回语句呢?注释文件给出了提示:
PyErr_SetString(PyExc_TypeError,"Memoryview return value is not initialized");
令人惊讶的是,谷歌搜索 cython "Memoryview return value is not initialized" 结果为零。
【问题讨论】:
-
Cython 版本 0.19.2
-
在你的真实代码中,你需要返回内存视图还是可以像这里一样修改它?做这些改变给了我 40 倍的加速。我不确定是否有办法关闭该检查...
-
真实代码迭代求解常微分方程,所以是的,我确实需要返回它。
-
嗯,让我们看看 cython 向导是否知道快速返回小内存视图的方法。作为一种解决方法,可以重写
f以接受 data_in 和 data_out 缓冲区而不是返回它。
标签: python numpy cython memoryview