分配 uint32_t 的 cython 内存视图的最佳方法

Best way to allocate a cython memoryview of uint32_t

我想分配、零初始化和 return 任意数量元素的 cython 内存视图。元素类型应为 uint32_t(在某些情况下为 uint16_t)。

一个问题似乎是为固定大小的整数类型找到正确的格式代码,有没有好的方法,或者是否归结为测试每个替代方案(例如使用 struct.calcsize)?

(不使用 numpy。)

如果您的编译器支持 stdint.hint32_t(和类似的)可以从 libc.stdint:

导入
%%cython

from libc.stdint cimport uint32_t
from cython.view cimport array as cvarray

def create(len):
    cdef uint32_t[:] memview = cvarray(shape=(len,), itemsize=sizeof(uint32_t), format=b"=I")
    return memview

内存视图需要由拥有内存的东西支持 - 我选择了 cython 的数组。

还使用了format=b"=I"。这里重要的是字符 = 其中 guarantees the "standard" itemsize of 4bytes (which b"I" does not by the way). An alternative would be 作为,例如

%%cython

...
cdef uint32_t tmp = 1
fuint32_t = (<uint32_t[:1]>(&tmp)).format  # use this to create carray