You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 17:32:31