入力として 1D numpy 配列を受け入れ、出力として 1D numpy 配列を返す単純な cython ルーチンを最適化しようとしています。
私は単純なバージョンを動作させており、現在、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
setup.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 のバージョンに問題があるこの問題を抱えている他の人を見たことがありますが、私にはそうではないと思います (私はそこに提案を受け入れますが)。任意の提案をいただければ幸いです。