【发布时间】:2015-12-25 20:40:34
【问题描述】:
我想使用 Cython 来加速我的 Python 代码,类似于 Cython's Numpy tutorial。我给你一个我想要的 MWE:
测试功能:
import pyximport
pyximport.install()
import CythonModule2 as cm2
print cm2.read_data()
Cython 模块CythonModule2.pyx:
from libc.stdio cimport *
import numpy as np
cimport numpy as np
cdef packed struct CData:
np.float32_t A
np.uint8_t CH1, CH2
np.int64_t D
def read_data():
cdef np.ndarray[CData] coins = np.empty(10, dtype=[('A', 'f4'),
('CH1', '|u1'), ('CH2', '|u1'),
('D', '<i8')])
return coins;
函数read_data() 中的定义产生以下错误消息(以及C++“以不寻常的方式终止”):
ValueError:缓冲区数据类型不匹配;下一个字段的偏移量为 6,但预期为 8
我可以将所有条目格式化为 64 位(八字节)变量,但我希望数据尽可能小以节省空间。
顺便说一句:我的电脑设置如下:
- Windows 7 64 位
- 32 位 Python(x,y) 2.7.6
- MinGW 的编译器
mingw32-gcc-4.8.1. - Cython 版本 0.23.2
- Numpy 版本 1.10.0
我认为这与上一个问题中的错误不同,因为我更新了 Cython:Passing a structured numpy array with strings to a cython function
编辑
使用distutils 编译模块会显示相同的错误。执行函数时,出现上述错误。
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize('CythonModule2.pyx'))
import CythonModule2 as cm2
print cm2.read_data()
编辑 2:输出文件
没有名为CythonModule2.pyd 的文件。创建的文件(CythonModule2.c、CythonModule2.def、CythonModule2.o)存储在以下位置:
C:\Users\Myself.pyxbld\temp.win32-2.7\Release\pyrex\
【问题讨论】:
-
u1是 unicode,即 3 或 4 个字节。 -
所以这意味着我应该用
CH1和CH2重写这一行?如果我从CData和定义中删除它们,问题仍然存在。您对float和int有其他想法吗? -
我将 Numpy 更新到 1.10.0 版,但问题没有解决。
-
抱歉,我把
u1误认为U1。这是您所期望的uint8。
标签: python arrays numpy cython