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