gpt4 book ai didi

python - 为 32 位和 64 位编写 cython?

转载 作者:太空宇宙 更新时间:2023-11-04 05:55:22 24 4
gpt4 key购买 nike

我正在使用一些 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,它们对应于 intlong,分别在 c/cython 中。 (这是否正确?)

那么,编写同时适用于 32 位和 64 位的 cython 的推荐或标准做法是什么?

  1. 我是否应该检查 platform.architecture 并将 ctypedef 放在我的 .pyx 文件的顶部?将 ctypedef 放入 if 语句中是否有效?像这样:

    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):
    ...
  2. 我是否应该单独使用 cython 库强制输入数组为 32 位整数?像这样:

    import numpy as np
    import my_cython_library

    data = np.arange(10, dtype='int32')
    my_cython_library.f(data)
  3. 我是否在 cython 构建或编译选项中遗漏了一些明显的东西?

我不喜欢 (1),因为那时我有自定义类型,只是用于基本整数,我不喜欢 (2),因为那时我使用我的硬件很差,即使它应该指定类型显而易见。所以我希望有一个好的选择 (3)。

最佳答案

如何声明一个 fused type ,例如:

cimport numpy as np

ctypedef fused int_t:
np.int32_t
np.int64_t

cdef int_t my_func(int_t[:] A, int_t[:] B):
...

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

关于python - 为 32 位和 64 位编写 cython?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28112599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com