【问题标题】:Itertools vs Nested Loops PerformanceItertools 与嵌套循环性能
【发布时间】:2016-09-18 04:08:25
【问题描述】:

我必须在列表中生成所有 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

我的问题是:使用其中一个有什么显着优势吗?

【问题讨论】:

  • 第二个看起来更好,可能更快。您可以轻松编写程序来测试速度,只需设置foo = range(1000) 即可很好地测试。
  • print foo[i], foo[j] 实际上并没有和print c 做同样的事情。第一个版本打印 foo[i]foo[j] 以空格分隔,而第二个版本打印一个元组。
  • @user2357112,我在考虑这个;我已将其更改为在列表中保存一个元组,并在两者上运行 timeit。

标签: python performance loops itertools


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-09-06
    • 2019-11-13
    • 2013-01-29
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多