我试着在这个URL的例子。 http://cython.readthedocs.io/en/latest/src/userguide/buffer.htmlCython缓冲区协议示例错误
为了测试它,我做了以下工作。
import pyximport
pyximport.install(build_dir = 'build')
import ctest
m = ctest.Matrix(10)
m.add_row()
print(m)
这给了我一个错误,当我打电话被定义为
from cpython cimport Py_buffer
from libcpp.vector cimport vector
cdef class Matrix:
cdef Py_ssize_t ncols
cdef Py_ssize_t shape[2]
cdef Py_ssize_t strides[2]
cdef vector[float] v
def __cinit__(self, Py_ssize_t ncols):
self.ncols = ncols
def add_row(self):
"""Adds a row, initially zero-filled."""
self.v.extend(self.ncols)
...
此错误m.add_row()函数说 TypeError: 'int' object is not iterable
在类add_row使得完全有道理的,我假设在cython中调用一个向量的扩展与python列表中的扩展完全一样。您不会将它传递给一个数字,而是一个附加到列表中的可迭代对象。
我可以这样解决它......
def add_row(self):
"""Adds a row, initially zero-filled."""
self.v.extend([0] * self.ncols)
我只是或不知道是否有在本例中一个错字如果我失去了一些东西。此外,扩展函数来自矢量的位置在哪里?在使用cython发布的vector.pxd文件中,它永远不会导入扩展函数,并且它甚至不存在于C++标准库中。 cython是否对矢量类型做了特别的事情?
https://github.com/cython/cython/blob/master/Cython/Includes/libcpp/vector.pxd
可能值得添加的是,列表不会被转换回向量,所以向量不会被延长。 – DavidW
这是正确的,添加另一个代码片段来显示。 – oz1