擅长:python、mysql、java
<p>当你开始增加迭代内容的大小时,<code>map</code>和<code>imap</code>之间的区别就变得很明显了:</p>
<pre><code># xrange object, takes up no memory
data = xrange(1000000000)
# Tries to builds a list of 1 billion elements!
# Therefore, fails with MemoryError on 32-bit systems.
doubled = map(lambda x: x * 2, data)
# Generator object that lazily doubles each item as it's iterated over.
# Takes up very little (and constant, independent of data's size) memory.
iter_doubled = itertools.imap(lambda x: x * 2, data)
# This is where the iteration and the doubling happen.
# Again, since no list is created, this doesn't run you out of memory.
sum(iter_doubled)
# (The result is 999999999000000000L, if you're interested.
# It takes a minute or two to compute, but consumes minimal memory.)
</code></pre>
<p>注意,在Python 3中,内置的<code>map</code>的行为类似于Python 2的<code>itertools.imap</code>(因为不再需要而被删除)。为了获得“旧的<code>map</code>”行为,您可以使用<code>list(map(...))</code>,这是另一种可视化Python 2的<code>itertools.imap</code>和<code>map</code>之间差异的好方法。</p>