Itertools与嵌套循环的性能比较

3

我需要生成一个列表中所有可能的2个元素组合。现在,我知道两种方法可以实现这个目标:使用嵌套的for循环或者使用Python内置的itertools模块:

from itertools import combinations

foo = [1, 2, 3, 4]

for i in xrange(len(foo)):
    for j in xrange(i + 1, len(foo)):
        print foo[i], foo[j]

for c in  combinations(foo, 2):
    print c

我的问题是:使用其中之一是否有明显的优势?

1
第二个看起来好看多了,而且可能更快。你可以轻松编写一个程序来测试速度,只需将 foo = range(1000) 设置为一个良好的测试即可。 - Alex Hall
“print foo[i], foo[j]” 和 “print c” 实际上并不做相同的事情。第一个版本打印由空格分隔的“foo[i]”和“foo[j]”,而第二个版本则打印一个元组。 - user2357112
@user2357112,我正在考虑这个问题;我已经改为将元组保存在列表中,并在两者上运行了timeit。 - Teknophilia
1个回答

6

因此,我使用Python的timeit来测量运行时间,按照@user2357112的建议修改了第一个循环:

import timeit
from itertools import combinations

foo = [i for i in xrange(0, 1000)]    

def loop_test():
    combos = []
    for i in xrange(len(foo)):
        for j in xrange(i + 1, len(foo)):
            combos.append((foo[i], foo[j]))    

def iter_test():
    combos = []
    for c in combinations(foo, 2):
        combos.append(c)    

if __name__ == '__main__':
    print timeit.timeit('loop_test()', setup='from __main__ import loop_test', number=1000)
    print timeit.timeit('iter_test()', setup='from __main__ import iter_test', number=1000)

产生输出结果:

59.1836869717
45.6625859737

有趣的是,看起来 itertools 比嵌套循环更快。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接