Python Cython缓冲协议示例错误
我正在这个url上尝试这个例子 为了测试它,我执行以下操作Python Cython缓冲协议示例错误,python,c++,cython,Python,C++,Cython,我正在这个url上尝试这个例子 为了测试它,我执行以下操作 import pyximport pyximport.install(build_dir = 'build') import ctest m = ctest.Matrix(10) m.add_row() print(m) 当我调用m.add_row()函数时,会出现一个错误 TypeError:“int”对象不可编辑 在类中,add_行定义为 from cpython cimport Py_buffer from libcpp.ve
import pyximport
pyximport.install(build_dir = 'build')
import ctest
m = ctest.Matrix(10)
m.add_row()
print(m)
当我调用m.add_row()函数时,会出现一个错误
TypeError:“int”对象不可编辑
在类中,add_行定义为
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)
...
假设在cython中对向量调用extend与在python列表中调用extend做的事情完全相同,那么这个错误对我来说是完全有意义的。您传递的不是一个数字,而是一个附加到列表中的iterable对象
我可以通过这样做来修复它
def add_row(self):
"""Adds a row, initially zero-filled."""
self.v.extend([0] * self.ncols)
我只是想知道示例中是否有输入错误,或者我是否遗漏了什么。另外,向量的extend函数从何而来?在Cython分发的VC.T.PXD文件中,它从不导入扩展函数,甚至不存在于C++标准库中。cython对向量类型有什么特殊的作用吗
cpp
向量可以自动转换为python列表。通过检查行self.v.extend([0]*self.ncols)
,创建了一个新的python列表:\upyx\ut\u2=PyList\unew(1*((\upyx\uv\uself->ncolsncols))
。因此extend
实际上是python列表的extend
方法
这种自动转换也可以通过以下代码进行验证(在jupyter笔记本中):
此外,c数组还可以自动转换为python列表:
%%cython
def test_c_array_to_pylist():
cdef int i
cdef int[10] ca
for i in range(10):
ca[i] = i
return ca
a = test_c_array_to_pylist()
print a # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print type(a) # <type 'list'>
%%cython
def test_c_array_to_pylist():
cdef int i
cdef int[10]ca
对于范围(10)内的i:
ca[i]=i
返回ca
a=测试\u c\u数组\u到\u pylist()
打印a#[0,1,2,3,4,5,6,7,8,9]
打印类型(a)#
值得一提的是,列表不会转换回向量,因此向量最终不会被扩展。没错,请添加另一个代码段来显示这一点。
%%cython -+
from libcpp.vector cimport vector
def test_cpp_vector_to_pylist_1():
cdef vector[int] cv
for i in range(10):
cv.append(i) # Note: the append method of python list
return cv
a = test_cpp_vector_to_pylist_1()
print a # []
print type(a) # <type 'list'>
%%cython
def test_c_array_to_pylist():
cdef int i
cdef int[10] ca
for i in range(10):
ca[i] = i
return ca
a = test_c_array_to_pylist()
print a # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print type(a) # <type 'list'>