Python 为32位和64位写入cython?
我正在处理一些cython模块的项目,这些模块包含如下函数定义Python 为32位和64位写入cython?,python,numpy,64-bit,cython,Python,Numpy,64 Bit,Cython,我正在处理一些cython模块的项目,这些模块包含如下函数定义 def f(np.ndarray[int, ndim=1, mode='c'] x): _f(&x[0]) cdef _f(int* x): ... 我在64位计算机上,因此在运行时调用f时会出现如下错误: ValueError: Item size of buffer (8 bytes) does not match size of 'int' (4 bytes) 通过更改为long整数,可以“修复”
def f(np.ndarray[int, ndim=1, mode='c'] x):
_f(&x[0])
cdef _f(int* x):
...
我在64位计算机上,因此在运行时调用f
时会出现如下错误:
ValueError: Item size of buffer (8 bytes) does not match size of 'int' (4 bytes)
通过更改为long
整数,可以“修复”代码以在我的机器上运行:
def f(np.ndarray[long, ndim=1, mode='c'] x):
_f(&x[0])
cdef _f(long* x):
...
问题是NumPy整数数组在32位上默认为int32
,在64位上默认为int64
,这分别对应于c/cython中的int
和long
。(这是正确的吗?)
那么,对于编写同时适用于32位和64位的cython,推荐的或标准的做法是什么
platform.architecture
并在.pyx文件的顶部放置ctypedef
?在if语句中放置ctypedef
是否有效?大概是这样的:
import platform
bits, linkage = platform.architechure
if bits == '64bit':
ctypedef long myint_t
elif bits == '32bit':
ctypedef int myint_t
def f(np.ndarray[myint_t, ndim=1, mode='c'] x):
_f(x)
cdef _f(long* x):
...
import numpy as np
import my_cython_library
data = np.arange(10, dtype='int32')
my_cython_library.f(data)
import platform
bits, linkage = platform.architechure
if bits == '64bit':
ctypedef long myint_t
elif bits == '32bit':
ctypedef int myint_t
def f(np.ndarray[myint_t, ndim=1, mode='c'] x):
_f(x)
cdef _f(long* x):
...
import numpy as np
import my_cython_library
data = np.arange(10, dtype='int32')
my_cython_library.f(data)
这样,您就可以拥有一个静态类型的Cython函数,它可以对32位或64位整数进行操作。这正是我所希望的(简单的)事情!我试试看。我意识到在我的示例中,
f
是一个纯c函数的包装,该函数声明为cdef\u f(int*x)
。希望融合型也能对我有所帮助。我将更新我的问题以包括这一点。是否有理由不使用cdef\f(int\u t*x)
?不,这就是我要做的。不过,fused类型和我在(1)中建议的ctypedef
之间没有太大区别。为什么我要选择融合类型而不是条件ctypedef,或者反之亦然?首先,融合类型更灵活,因为无论在什么平台上编译,它都可以接受任何类型的整数。由于这个原因,使用了Cython保险丝类型。我终于回到了这个问题上,但它不起作用。我得到无法强制为非专用的类型
和融合类型的无效使用,类型无法专用