什么时候应该使用map / filter而不是list comprehension或generator expression?
答案 0 :(得分:6)
您可能需要查看对此问题的回复:
Python List Comprehension Vs. Map
此外,这是来自Guido的相关文章,Python的创建者和BDFL:
http://www.artima.com/weblogs/viewpost.jsp?thread=98196
就个人而言,我更喜欢列表推导和生成器表达式,因为在阅读代码时它们的含义更为明显。
答案 1 :(得分:1)
列表推导和生成器表达式通常被认为是更加pythonic。编写python代码时,最好使用列表推导和生成器表达式,因为这是python程序员倾向于做事的方式。
像列表推导一样映射和过滤两个返回列表对象。 Generator表达式返回一个生成器。使用生成器,可以根据需要进行计算,而不是计算和存储结果。如果输入大小很大,这可能会导致内存使用率降低。另外,请记住,生成器不可索引。必须按顺序阅读它们。
以下是使用不同方法转换数字序列并使用列表推导,生成器表达式和映射对它们求和时内存使用情况会有所不同的一些示例。
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()