Python Itertools与嵌套循环性能
我必须生成列表中所有项目的2对组合。现在,我知道了两种实现方法:嵌套for循环和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():
我的问题是:使用一个循环比另一个循环有什么显著的优势吗?因此我继续使用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