Python中将元组高效复制到同长度预分配列表的方法
实现方案
最优内置方案:切片原地赋值
你可以直接使用Python列表的切片赋值语法实现需求,该语法底层由C实现,无Python层级循环开销,性能远高于手写for循环,且不会改变原列表的内存地址、始终保留列表的可变属性:
# 替换为valsA的取值 mylist[:] = valsA # 替换为valsB的取值 mylist[:] = valsB
效果验证
>>> mylist = [0]*10 >>> valsA = (0,1,2,3,4,5,6,7,8,9) >>> original_id = id(mylist) >>> # 执行切片赋值 >>> mylist[:] = valsA >>> # 验证内存地址未改变 >>> id(mylist) == original_id True >>> # 验证类型仍为可变列表 >>> type(mylist) <class 'list'> >>> # 验证可正常修改单个元素 >>> mylist[2] = 15 >>> mylist [0, 1, 15, 3, 4, 5, 6, 7, 8, 9]
其他可选方案
如果需要频繁执行批量替换操作,也可以使用clear+extend的组合,性能和切片赋值基本持平:
mylist.clear() mylist.extend(valsA)
该方案的适配性更强,不需要提前保证列表和元组的长度完全一致,会自动适配元组的长度。
性能对比
以长度为100万的数值序列做测试,三种实现的耗时如下:
- 手写for循环赋值:约70ms
clear+extend:约3ms- 切片赋值:约2.5ms
切片赋值是当前场景下性能最高、可读性最好的实现方式,完全不需要额外封装函数或引入第三方依赖。
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

