Python中的列表推导是否以内存有效的方式减少?

时间:2011-03-18 08:49:26

标签: python list reduce

我是Python的初学者,这是我的第一篇文章,所以不要太苛刻:)。我最近一直在玩Python,并想知道是否像

max([x for x in range(25)]) 

会导致Python首先创建所有元素的列表,然后找到最大值,产生O(2n)时间,或者它会跟踪Θ(n)迭代时的最大值。另外,由于Python3中的范围不同(是可迭代的),这会使它与Python2中的不同吗?

2 个答案:

答案 0 :(得分:14)

您的示例将导致Python首先构建整个列表。如果你想避免这种情况,你可以使用生成器表达式:

max((x for x in range(25)))

或简单地说:

max(x for x in range(25))

当然(在Python 2中),range本身会构建一个完整的列表,所以在这种情况下你真正需要的是:

max(x for x in xrange(25))

然而,关于所花费的时间,所有这些表达具有相同的复杂性。重要的区别是最后一个需要O(1)空间,而其他需要O(n)空间。

答案 1 :(得分:2)

列表推导总是生成一个列表(除非有什么抛出异常)。在大多数情况下,建议使用genex。

max(x for x in xrange(25))