Python 为32位和64位写入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整数,可以“修复”

我正在处理一些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[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)
    
  • 我应该不使用cython库强制输入数组为32位整数吗?大概是这样的:

    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构建或编译选项中遗漏了一些明显的内容

  • 我不喜欢(1),因为这样我就有了基本整数的自定义类型,我也不喜欢(2),因为这样我就不能很好地使用我的硬件,甚至在应该很明显的情况下指定类型。因此,我希望有一个好的选择(3)。

    如何声明a,例如:


    这样,您就可以拥有一个静态类型的Cython函数,它可以对32位或64位整数进行操作。

    这正是我所希望的(简单的)事情!我试试看。我意识到在我的示例中,
    f
    是一个纯c函数的包装,该函数声明为
    cdef\u f(int*x)
    。希望融合型也能对我有所帮助。我将更新我的问题以包括这一点。是否有理由不使用
    cdef\f(int\u t*x)
    ?不,这就是我要做的。不过,fused类型和我在(1)中建议的
    ctypedef
    之间没有太大区别。为什么我要选择融合类型而不是条件ctypedef,或者反之亦然?首先,融合类型更灵活,因为无论在什么平台上编译,它都可以接受任何类型的整数。由于这个原因,使用了Cython保险丝类型。我终于回到了这个问题上,但它不起作用。我得到
    无法强制为非专用的类型
    融合类型的无效使用,类型无法专用