在 python 中预分配数组还是使用 arr.append() 更好?

clu*_*msy 7 python performance

在可读性和性能方面,我应该使用 为数组预分配内存吗[None]*n?分配一个空的[].append()反复使用是否算浪费?

ala*_*ani 7

在这个简单的计时测试中,使用[None] * n确实看起来稍微快一些,但可以说不足以证明采用这种方法优于更常见的习惯用法。

import time

def func1(size):
    a = [None] * size
    for i in range(size):
        a[i] = i

def func2(size):
    a = []
    for i in range(size):
        a.append(i)

def func3(size):
    a = [i for i in range(size)]

    
size = 1000000
repeat = 100
    
t0 = time.time()

for _ in range(repeat):
    func1(size)
t1 = time.time()

for _ in range(repeat):
    func2(size)
t2 = time.time()

for _ in range(repeat):
    func2(size)
t3 = time.time()

print(t1 - t0, t2 - t1, t3 - t2)
Run Code Online (Sandbox Code Playgroud)

结果:

  • [None * size]然后索引:4.82秒
  • append循环:6.37 秒
  • 列表理解:6.34 秒

重复测试 和size=1000给出repeat=100000类似的结果:

  • [None * size]然后索引:3.16秒
  • append循环:4.88 秒
  • 列表理解:4.84 秒

再次使用size=10and repeat = 10000000

  • [None * size]然后索引:6.09秒
  • append循环:7.65 秒
  • 列表理解:7.66 秒