擅长:python、mysql、java
<p>这似乎没有直接记录在案。我能给你的最好参考资料是这里的打字记忆视图<a href="https://cython.readthedocs.io/en/latest/src/userguide/memoryviews.html#typed-memoryviews" rel="nofollow noreferrer">docs</a>。在</p>
<p>这似乎是支持<a href="https://www.python.org/dev/peps/pep-3118/" rel="nofollow noreferrer">PEP 3118</a>缓冲区协议的结果,而不是对numpy结构化数据类型的特定cython支持。numpy为它的数组公开了一个<code>Py_buffer</code>结构,cython知道如何将它们转换成结构。在</p>
<p>包装是必要的。我的<a href="https://en.wikipedia.org/wiki/Data_structure_alignment#Typical_alignment_of_C_structs_on_x86" rel="nofollow noreferrer">understanding</a>is x86是在itemsize字节边界上对齐的,而作为numpy结构的数据类型则压缩到尽可能小的空间中。最清楚的例子是:</p>
<pre><code>%%cython
import numpy as np
cdef struct Thing:
char a
# 7 bytes padding, double must be 8 byte aligned
double b
thing_dtype = np.dtype([('a', np.byte), ('b', np.double)])
print('dtype size: ', thing_dtype.itemsize)
print('unpacked struct size', sizeof(Thing))
dtype size: 9
unpacked struct size 16
</code></pre>