如何在Cython中获取vector的子vector?
在Cython中高效获取泛型vector的子vector
要避免Python列表转换的性能开销,同时绕开Cython对C++迭代器构造方式的编译限制,你可以用以下两种可靠的方法:
方法一:使用insert方法(推荐)
直接创建空的目标vector,调用insert方法插入原vector指定范围的元素,这是Cython完全支持的C++容器操作,不会产生额外的类型转换开销:
cdef vector[string] a = [b'a', b'b', b'c'] cdef vector[string] b # 插入原vector中从begin到begin+2的元素(即前2个元素) b.insert(b.begin(), a.begin(), a.begin() + 2)
方法二:先resize再手动拷贝
如果需要更精细的控制,可以先将目标vector调整到目标大小,再通过std::copy拷贝元素:
from libcpp.algorithm cimport copy cdef vector[string] a = [b'a', b'b', b'c'] cdef vector[string] b b.resize(2) copy(a.begin(), a.begin() + 2, b.begin())
为什么你的原有写法不行?
Cython对C++容器的**列表初始化(大括号语法)**支持有限,直接用cdef vector[string] b = {a.begin(), a.begin() + 2}这种方式会触发编译错误,因为Cython无法正确解析这种构造器调用。
而a[:2]会触发Cython的自动类型转换,把C++ vector的切片转换成Python列表,再赋值给新的vector时又要转回去,这中间的两次类型转换会带来明显的性能开销,尤其在处理大量数据时影响显著。
内容的提问来源于stack exchange,提问作者Kris
相关产品推荐
相关产品推荐

