编辑:正如其他评论中所指出的,Python中没有元组推导,因为该语法已经用于生成器表达式。我已经澄清了描述。
值得指出的是,这个问题的答案取决于每次迭代添加的列表/元组的大小。对于较大的列表,使用extend明显优于append(而列表与元组之间没有区别)。从mgilson的答案开始,我检查了包含600个项目的集合的行为,而不是2个项目:
调用append 600次所需的时间是使用手动定义的列表/元组(即[v,v,v,v,v,v,v...])使用extend()的8倍:
42.4969689846
5.45146393776
5.38034892082
这五秒钟的大部分时间实际上是用于创建列表/元组。在调用
timeit
之前准备它可以将extend的时间降低到最低。
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_genexp(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_genexp([], repetitions)', setup='from __main__ import extend_genexp, repetitions')
(通过for循环和列表推导式来实现附加,以消除两种循环方式之间的效率差异。)
(计时如下:)
53.8211231232
57.1711571217
19.8829259872
28.5986201763
正如我们所看到的,使用列表推导的扩展仍然比追加快两倍以上。生成器表达式比列表推导明显慢。`append_comp`只会引入不必要的列表创建开销。
extend
不比2个.appends
更快,我会感到非常惊讶。 - mgilsonsqrt(28123)
的质数,然后对于每个i
,我会将其分解因式并使用itertools.product
获取将因子组合成除数的所有方式,最后将它们相加。 - Lauritz V. Thaulow