【发布时间】:2021-06-16 14:34:01
【问题描述】:
我对使用 Cython 很陌生,我对使用“纯 Python”模式很感兴趣。
我现在正在做的工作广泛使用 numpy,并且知道有一个用于 numpy 的 C api,我很高兴看到它可以做什么。
作为一个小测试,我将两个小测试文件放在一起,test.py 和 test.pxd。它们的内容如下:
test.py:
import cython
import numpy as np
@cython.locals(array=np.ndarray)
@cython.returns(np.ndarray)
def test(array):
return np.cumsum(array)
test_array = np.array([1,2,3,4,5])
test(test_array)
test.pxd:
# cython: language_level=3
cimport numpy as np
cdef np.ndarray test(np.ndarray array)
然后我用cython -a test.py 编译这些文件,希望在调用np.cumsum() 时我几乎看不到python 交互。然而,当我检查生成的 HTML 文件时,我发现了以下内容:
由此看来,我对 np.cumsum 的调用似乎与 python 进行了大量交互,这让人感觉很反直觉。我的期望是,因为我(应该)使用 cimported numpy,所以应该很少有 python 交互。
我的问题是“我的直觉正确吗?”。我是否对我的文件进行了错误设置,不允许 cimported numpy 实际用于函数调用,这就是为什么我仍然看到这么多黄色的原因?还是我从根本上误解了什么。
感谢阅读!
【问题讨论】:
-
您使用的是导入功能,而不是 cimported 功能。使用“cimport numpy as cnp”查看差异。
-
阅读后我认为这不是解决方案@ead,似乎会导致编译错误:'cimported module has no attribute "cumsum"'。在下面的帖子之后,似乎 cimport 只能让您访问预定义的类型,而不是 numpy 函数的 c 版本。 stackoverflow.com/questions/53026820/…
-
这只是一个解释,为什么你会看到 python 开销,而不是加速事情的方法。如果 cumsum 没有 c-api 版本,你将不得不支付这个开销。