Cython Memoryviews - 来自结构数组?

rad*_*lus 7 c python cython

我想快速填写尽可能少的副本,我从C逐渐收到一长串结构.

如果我的结构只是主要数据类型,如下所示:

cdef packed struct oh_hi:
    int lucky
    char unlucky
Run Code Online (Sandbox Code Playgroud)

然后以下工作正常:

  DEF MAXPOWER = 1000000
  cdef oh_hi * hi2u = <oh_hi *>malloc(sizeof(oh_hi)*MAXPOWER)
  cdef oh_hi [:] hi2me = <oh_hi[:MAXPOWER]> hi2u
Run Code Online (Sandbox Code Playgroud)

但是一旦我改变我的结构来保存一个字符数组:

cdef packed struct oh_hi:
    int lucky
    char unlucky[10]
Run Code Online (Sandbox Code Playgroud)

之前的memoryview转换编译,但运行时给出:

  ValueError: Expected 1 dimension(s), got 1
Run Code Online (Sandbox Code Playgroud)

在Cython中有一个简单的方法吗?我知道我可以创建一个结构化数组,但afaik,这不会让我直接将C结构分配给它.

rad*_*lus 5

实际上,只需构建一个结构化的 numpy 数组,然后使用 memoryview 就可以了。

cdef np.ndarray hi2u = np.ndarray((MAXPOWER,),dtype=[('lucky','i4'),('unlucky','a10')])
cdef oh_hi [:] hi2me = hi2u
Run Code Online (Sandbox Code Playgroud)

这样做的性能似乎非常好,如果您需要将数据返回到 python 中,这可以保存以后的副本。按照惯例,numpy 版本非常好。=p