什么时候应该使用 map/filter 而不是列表推导或生成器表达式?
您可能想要查看这个问题的回答:
此外,这是来自 Python 的创始人和BDFL Guido 的相关文章:
http://www.artima.com/weblogs/viewpost.jsp?thread=98196
个人而言,我更喜欢列表推导式和生成器表达式,因为在阅读代码时它们的含义更加明显。
列表推导式和生成器表达式通常被认为是更具Python风格的。在编写Python代码时,最好使用列表推导式和生成器表达式,因为这是Python程序员倾向于做事情的方式。
map和filter都返回与列表推导式相同的列表对象。生成器表达式返回一个生成器。使用生成器,计算仅在需要时发生,而不是计算和存储结果。如果输入大小较大,则可以减少内存使用。此外,请记住,生成器不可索引。必须按顺序从中读取。
以下是使用不同方法转换数字序列并使用列表推导式、生成器表达式和map对它们进行求和时,内存使用情况会有所不同的一些示例。
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()