我有一个非常简单的cython模块,名为empty_test.pyx
:
cimport numpy as cnp
cpdef return_empty():
return cnp.empty(0, dtype=np.int32)
当我尝试运行时,出现return_empty
以下错误:
empty_test.pyx:5:14: cimported module has no attribute 'empty'
这是我的setup.py
文件:
from distutils.core import setup
from Cython.Build import cythonize
import numpy as np
setup(
ext_modules=cythonize(['empty_test.pyx'],
),
include_dirs = [np.get_include()],
)
我知道我可以尝试import numpy as np
代替cimport numpy as np
,但是我正在尝试使用C版本的numpy代码。
为了实现这一点,您必须直接访问numpy的C-API,它至少部分由Cython包装。在您的情况下,您需要使用numpy将PyArray_SimpleNew
其导入。
因此,您的功能变为:
%%cython
cimport numpy as cnp
cnp.import_array() # needed to initialize numpy-API
cpdef return_empty():
cdef cnp.npy_intp dim = 0
return cnp.PyArray_SimpleNew(1, &dim, cnp.NPY_INT32)
现在:
>>> return_empty()
array([], dtype=int32)
显然,由于引用计数,仍然存在一些Python开销,但与使用时相比,它要少得多np.empty()
:
>>> %timeit return_empty()
159 ns ± 2.81 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
>>> %timeit return_empty_py
751 ns ± 8.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
使用PyArray_SimpleNew
的速度也比使用Cython的速度快(大约3倍)array
(您在另一个问题中考虑过):
%%cython
from cython.view cimport array as cvarray
# shape=(0,) doesn't work
cpdef create_almost_empty_carray():
return cvarray(shape=(1,), itemsize=sizeof(int), format="i")
因此:
>>> %timeit create_almost_empty_carray()
435 ns ± 5.85 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
列出使用的功能return_empty_py
:
%%cython
cimport numpy as cnp
import numpy as np
cpdef return_empty_py():
return np.empty(0, np.int32)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句