序列图和Python列表

Map vs list comprehension in Python

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Python List Comprehension Vs. Map

什么时候应该使用map/filter而不是列表理解或生成器表达式?


你可能想看看这个问题的答案:

python列表理解与映射

另外,这里还有一篇Python的创建者和BDFL Guido的相关文章:

http://www.artima.com/weblogs/viewpost.jsp?线程=98196

就我个人而言,我更喜欢列表理解和生成器表达式,因为它们的含义在读取代码时更明显。


列表理解和生成器表达式通常被认为更像是Python。在编写python代码时,最好使用列表理解和生成器表达式,因为这是python程序员做事情的方式。

映射和过滤两个返回列表对象,就像列表理解一样。生成器表达式返回生成器。使用生成器,计算将根据需要进行,而不是计算和存储结果。如果输入大小较大,这会导致内存使用率降低。另外,请记住,生成器是不可索引的。它们必须按顺序读取。

下面是一些例子,说明当使用不同的方法转换一个数字序列并使用列表理解、生成器表达式和映射求和时,内存使用会有什么不同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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()