1

我正在尝试优化我编写的一个简单的 cython 例程,该例程接受 1D numpy 数组作为输入并返回 1D numpy 数组作为输出。

我有一个幼稚的版本正在工作,现在正尝试对cython 代码的 numpy 部分进行一些标准优化。

但是,一旦我添加cimport numpy到我的 cython 源文件,我就无法运行扩展模块(尽管它可以编译),抛出一个ValueError: numpy.dtype does not appear to be the correct type object.

我的 numpy 版本是 1.6.0 和 python 版本 2.6.5(默认,Ubuntu 10.04 apt-get 安装)

导致问题的最小示例:


test_ext.pyx

import numpy as np
cimport numpy as np #Commenting this line un-breaks the extension

def test_ext(refls, str mode, int nguard, int nblock):

    cdef int i
    cdef int _len = refls.shape[0]
    _out = np.zeros([_len])

    for i in range(_len):
        _out[i] = refls[i] + 1
    return _out

安装程序.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [Extension("test_ext", ["test_ext.pyx"])]

setup(
    name = 'test',
    cmdclass = {'build_ext': build_ext},
    ext_modules = ext_modules
)

run_ext.py

import numpy
from test_ext import test_ext

a = np.array([x for x in range(260)])
_res = test_ext.test_ext(a, 'avg', 2, 3)

构建:

python setup.py build_ext --inplace

我的构建输出:

running build_ext
cythoning my_ext.pyx to my_ext.c
building 'my_ext' extension
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.6 -c my_ext.c -o build/temp.linux-x86_64-2.6/my_ext.o
/usr/include/python2.6/numpy/__multiarray_api.h:968: warning: ‘_import_array’ defined but not used
my_ext.c:732: warning: ‘__pyx_k_3’ defined but not used
my_ext.c:733: warning: ‘__pyx_k_4’ defined but not used
my_ext.c:753: warning: ‘__pyx_k_24’ defined but not used
my_ext.c:759: warning: ‘__pyx_k_26’ defined but not used
my_ext.c:760: warning: ‘__pyx_k_27’ defined but not used
my_ext.c:1118: warning: ‘__pyx_pf_5numpy_7ndarray___getbuffer__’ defined but not used
my_ext.c:1876: warning: ‘__pyx_pf_5numpy_7ndarray___releasebuffer__’ defined but not used
gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions build/temp.linux-x86_64-2.6/my_ext.o -o /home/path/to/my_ext.so

然后运行run_ext.py

cimport未注释该行,我收到错误:

Traceback (most recent call last):
  File "run_ext.py", line 2, in <module>
    from test_ext import test_ext
  File "numpy.pxd", line 43, in test_ext (test_ext.c:2788)
ValueError: numpy.dtype does not appear to be the correct type object

是什么原因造成的,我该如何解决它以继续优化我的扩展程序?我试图按照上面的链接继续进行优化,但是无论我走了多远,对我来说没有什么能解决这个问题。

我见过其他一些有这个问题的人有 python/numpy 的版本问题,但我不认为这对我来说是这种情况(尽管我愿意接受那里的建议)。任何建议表示赞赏。

4

1 回答 1

3

看起来我的构建文件只需要包含 numpy 包含文件。将 setup.py 更改为以下内容可以解决所有问题:

安装程序.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy   # << New line

ext_modules = [Extension("test_ext", ["test_ext.pyx"])]

setup(
    name = 'test',
    cmdclass = {'build_ext': build_ext},
    include_dirs = [numpy.get_include()], # << New line
    ext_modules = ext_modules
)
于 2012-10-24T02:07:36.697 回答