【发布时间】:2011-02-28 02:06:27
【问题描述】:
【问题讨论】:
标签: python
【问题讨论】:
标签: python
你可能想看看这个问题的回答:
Python List Comprehension Vs. Map
另外,这里有一篇来自 Python 的创建者和 BDFL Guido 的相关文章:
http://www.artima.com/weblogs/viewpost.jsp?thread=98196
就我个人而言,我更喜欢列表推导式和生成器表达式,因为它们的含义在阅读代码时更加明显。
【讨论】:
列表推导式和生成器表达式通常被认为更符合 Python 风格。在编写 python 代码时,最好使用列表推导和生成器表达式,因为这是 python 程序员倾向于做事的方式。
映射和过滤都返回列表对象,就像列表推导一样。生成器表达式返回一个生成器。使用生成器,计算会根据需要进行,而不是计算和存储结果。如果输入大小很大,这可能会导致较低的内存使用量。另外,请记住,生成器不可索引。它们必须按顺序读取。
下面是一些示例,说明在使用不同的方法转换数字序列并使用列表推导、生成器表达式和映射求和时,内存使用会有何不同。
k=1000
def transform(input):
return input + 1
"""
1. range(k) allocates a k element list [0...k]
2. Iterate over each element in that list and compute the transform
3. Store the results in a list
4. Pass the list to sum
Memory: Allocates enough 2 lists of size k
"""
print sum([transform(i) for i in range(k)])
"""
1. Create an xrange object
2. Pass transform and xrange object to map
3. Map returns a list of results [1...k+1]
4. Pass list to sum
Memory: Creates a constant size object and creates a list of size k
"""
print sum(map(transform, xrange(k)))
"""
1. Create an xrange object
2. Create a generator object
3. Pass generator object to sum
Memory: Allocates 2 objects of constant size
"""
print sum(transform(i) for i in xrange(k))
"""
Create a generator object and operate on it directly
"""
g = (transform(i) for i in xrange(k))
print dir(g)
print g.next()
print g.next()
print g.next()
【讨论】: