还值得指出的是,这个问题的答案取决于每次迭代中添加的列表/元组的小尺寸。对于较大的列表,extend 显然更胜一筹(列表与元组没有区别)。从mgilson的回答开始,我检查了包含 600 个项目而不是 2 个项目的集合的行为:调用 append 600 次所需的时间是使用extend()
手动定义的列表/元组(即[v,v,v,v,v,v,v...]
)的 8 倍:
42.4969689846
5.45146393776
5.38034892082
这五秒钟的大部分时间实际上是创建列表/元组。在通话之前准备好它timeit
会带来时间延长到
1.42491698265
0.657584905624
分别用于列表和元组。
对于更现实(和更公平)的情况,可以在函数调用中动态生成数据:
import timeit
def append_loop(foo, reps):
for i in range(reps):
foo.append(i)
def append_comp(foo, reps):
[foo.append(i) for i in range(reps)]
def extend_lst(foo, reps):
foo.extend([i for i in range(reps)])
def extend_tup(foo, reps):
foo.extend((i for i in range(reps)))
repetitions = 600
print timeit.timeit('append_loop([], repetitions)', setup='from __main__ import append_loop, repetitions')
print timeit.timeit('append_comp([], repetitions)', setup='from __main__ import append_comp, repetitions')
print timeit.timeit('extend_lst([], repetitions)', setup='from __main__ import extend_lst, repetitions')
print timeit.timeit('extend_tup([], repetitions)', setup='from __main__ import extend_tup, repetitions')
(Append 是通过 for 循环和列表理解来实现的,以消除两种循环方式之间的效率差异。)
时间是:
53.8211231232
57.1711571217
19.8829259872
28.5986201763
正如我们所看到的,使用列表推导进行扩展仍然比追加快两倍多。此外,元组理解似乎比列表理解慢得多,并且append_comp
只会引入不必要的列表创建开销。