Python Itertools与嵌套循环性能

Python Itertools与嵌套循环性能,python,performance,loops,itertools,Python,Performance,Loops,Itertools,我必须生成列表中所有项目的2对组合。现在,我知道了两种实现方法:嵌套for循环和python的内置itertools: 我的问题是:使用一个循环比另一个循环有什么显著的优势吗?因此我继续使用Python的timeit来测量运行时,按照@user2357112的建议修改第一个循环: import timeit from itertools import combinations foo = [i for i in xrange(0, 1000)] def loop_test():

我必须生成列表中所有项目的2对组合。现在,我知道了两种实现方法:嵌套for循环和python的内置itertools:


我的问题是:使用一个循环比另一个循环有什么显著的优势吗?

因此我继续使用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实际上比嵌套循环快。

第二个看起来更好,而且可能更快。您可以很容易地编写一个程序来测试速度,只需设置
foo=range(1000)
,使其成为一个良好的测试。
print foo[i],foo[j]
实际上与
print c
做的事情不同。第一个版本打印由空格分隔的
foo[i]
foo[j]
,而第二个版本打印一个元组。@user2357112,我正在考虑这个问题;我将其更改为在列表中保存一个元组,并在这两个元组上运行timeit。
59.1836869717
45.6625859737