Python中的Map vs list comprehension

时间:2010-06-05 05:31:16

标签: python

  

可能重复:
  Python List Comprehension Vs. Map

什么时候应该使用map / filter而不是list comprehension或generator expression?

2 个答案:

答案 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()