分配 uint32_t 的 cython 内存视图的最佳方法
Best way to allocate a cython memoryview of uint32_t
我想分配、零初始化和 return 任意数量元素的 cython 内存视图。元素类型应为 uint32_t(在某些情况下为 uint16_t)。
一个问题似乎是为固定大小的整数类型找到正确的格式代码,有没有好的方法,或者是否归结为测试每个替代方案(例如使用 struct.calcsize)?
(不使用 numpy。)
如果您的编译器支持 stdint.h
,int32_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
我想分配、零初始化和 return 任意数量元素的 cython 内存视图。元素类型应为 uint32_t(在某些情况下为 uint16_t)。
一个问题似乎是为固定大小的整数类型找到正确的格式代码,有没有好的方法,或者是否归结为测试每个替代方案(例如使用 struct.calcsize)?
(不使用 numpy。)
如果您的编译器支持 stdint.h
,int32_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