是否将列表设置为10,000个空值然后填充,或者更快地附加到空列表?

时间:2016-04-11 01:09:13

标签: python list initialization

如果我有一个长度为10,000个条目的列表,它是否更快:

  1. 制作一个空白列表然后附加到它。
    1. 列出一个填充了10,000个空白条目的列表,并将每个条目设置为数据。
    2. 示例代码

      # first case 
      a=[]
      for i in range(10000):
          a.append(input())
      # second case
      a= [0]*10000
      for i in range(10000):
          a[i] = input()
      

3 个答案:

答案 0 :(得分:7)

timeit模块非常适合测试此类事情:

# first case
def test1():
    a=[]
    for i in range(10000):
        a.append(1)
# second case
def test2():
    a= [0]*10000
    for i in range(10000):
        a[i] = 1

#list comprehension
def test3():
    a = [1 for _ in range(10000)]

import timeit
n = 10000
print("appending:    ",timeit.timeit(test1,number=n))
print("assigning:    ",timeit.timeit(test2,number=n))
print("comprehension:",timeit.timeit(test3,number=n))

输出:

appending:     13.14265166100813
assigning:     8.314113713015104
comprehension: 6.283505174011225

根据要求,我将timeit.timeit(...)替换为sum(timeit.repeat(..., repeat=7))/7以获得平均时间并获得此结果:

appending:     12.813485399578765
assigning:     8.514678678861985
comprehension: 6.271697525575291

与我原来的结果没有太大的不同。

答案 1 :(得分:4)

我以为我会尝试使用CS原则来回答,而不是根据经验进行计时,因为简单地计时它确实没有给出为什么一个更好,或者对于其他值是否正确的要点N

Python列表实现为数组。这意味着"追加"需要定期调整大小,而空白/重新分配选项是单个分配,后跟10,000 O(1)访问时间。因此,在限制中(例如,对于10K,100K,1M等),由于第一个选项所需的所有大小调整,我希望第二个选项 更快。

如需进一步阅读,请参阅:How is Python's List Implemented?

答案 2 :(得分:0)

它们的速度相当。 @Tadhg建议的列表理解速度大约是其两倍。

这些是时间结果:

first case:        10.3030366897583
second case:        9.829667568206787
list comprehension: 5.473726511001587

这是我使用的源代码:

from time import time
from random import random

# first case 
iterations = 10000000
start = time()
a=[]
for i in range(iterations):
    a.append(random())
print(time() - start)
# second case
start = time()
a= [0]*iterations
for i in range(iterations):
    a[i] = random()
print(time() - start)
start = time()
a = [random() for _ in range(iterations)]
print(time() - start)