如何在Python中快速创建无需初始化的超大型原生array数组
问题分析
你当前使用的写法存在两个核心问题:
- 存在语法错误,参数里多了一个多余的逗号,修正后的原始写法为
tb = array.array('i', (0,)*2000000) - 性能瓶颈来源于临时元组的开销:
(0,)*2000000会先创建包含200万个Python int对象的临时元组,单个Python int在64位环境下就占28字节,仅该临时元组就需要占用数十MB内存,后续还要逐个把Python int转换为C类型int写入array缓冲区,最后还要销毁临时元组,全程会产生大量额外开销,和你推测的大量malloc/free调用的表现一致。
优化方案
以下方案均基于原生array实现,不需要引入numpy,性能相比原始写法提升几十倍,耗时可压缩到5毫秒以内:
方案1:使用array乘法(最优)
array类型的乘法运算在C层面直接操作内存,不需要创建任何Python级别的临时序列,仅需一次malloc分配整块内存后批量填充值:
import array tb = array.array('i', (0,)) * 2000000
方案2:使用resize方法
先创建空array,直接调用resize方法扩容到指定长度,新增空间自动初始化为0:
import array tb = array.array('i') tb.resize(2000000)
方案3:使用frombytes批量导入
32位int单元素占4字节,200万元素共需8000000字节,直接生成对应长度的空字节串后导入:
import array tb = array.array('i') tb.frombytes(b'\x00' * 8000000)
原理说明
上述所有方案均规避了Python层面的对象创建开销,直接在C扩展层完成大块连续内存的分配和初始化,仅产生1次malloc调用,没有额外的临时对象创建和回收开销,完全适配超大型原生array的创建需求。如果你的场景使用无符号32位字,把类型码'i'替换为'I'即可。
内容的提问来源于stack exchange,提问作者user3435121
相关产品推荐
相关产品推荐

