【问题标题】:Itertools instead of nested loopsItertools 而不是嵌套循环
【发布时间】:2017-09-06 01:25:32
【问题描述】:
list_a = [] 
for color in [True,False]:
    for piece in range(1,7):
        list_a = list_a + function(piece,color)

这里function(piece,color)返回一个列表,我想加入,最后返回长列表,这里可以使用itertools.chain吗?因为我认为它可能会更快。我只展示了一个示例,但在我的实际代码中,循环运行了大约 100,000 次,这就是我寻找更快方法的原因。

【问题讨论】:

    标签: python python-3.x loops itertools


    【解决方案1】:

    如果你真的想使用itertools.chain

    >>> from itertools import product, chain
    >>> list_a = list(chain.from_iterable(function(piece, color) for piece, color in product([True, False], range(1, 7))))
    

    当然,如果您使用list_a += function(piece, color),这可能会同样快(也许更快?)。

    list_a = list_a + function(piece, color) 的问题在于该行在其输入中是二次,因为它构建了一个全新的列表,而list_a += function(piece, color) 相当于使用extend,这对于 Python列表是摊销的常数时间,因此内部部分保持线性而不是二次。

    【讨论】:

      【解决方案2】:

      你可以使用itertools.starmap,虽然你仍然会有循环,但你无法真正摆脱它们:

      result_generator = starmap(function, ((piece, color) for piece in range(1,7) for color in [True,False]))
      
      list_a = list(result_generator)
      

      然后,像这样使用itertools.product

      result_generator = starmap(function, product(range(1,7), [True,False]))
      

      【讨论】:

        【解决方案3】:

        我将回答你应该问的问题;-)

        这个:

        list_a = list_a + function(piece,color)
        

        执行次数与时间成二次方。每次都会创建一个全新的列表对象,复制整个旧的list_a 和新的列表。

        所以如果它被执行多次,你可以通过改变它来获得巨大的改进:

        list_a.extend(function(piece,color))
        

        然后list_a 尽可能“就地”扩展;在幕后,它可能需要不时地复制到更大的内存区域,但总体而言,摊销时间与其执行次数呈线性关系。

        【讨论】:

        • 最好的答案解释了如何解决它以及为什么他们错了。其他人都没有解释为什么lst = lst + ele 是个坏主意。
        【解决方案4】:

        yield from 似乎是这里的简单解决方案。

        def generator():
            for color in [True,False]:
                for piece in range(1,7):
                    yield from function(piece,color)
        

        【讨论】:

          猜你喜欢
          • 2016-09-18
          • 2012-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多