Python中的itertools.imap与map的性能方面的对比

时间:2024-03-20 21:44:56

先来理解看下一段代码:

>>> import itertools
>>> for i in itertools.imap(lambda x,y: x*y, [10, 20, 30], itertools.count(1)):
...     print(i)
...
10
40
90
>>>

第一段好理解,一个匿名函数,传递两个参数,返回两个参数的乘积。

第二段好理解,传递的是一个列表[10, 20, 30],用做参数x的功效

第三段要理解,先要用help()函数来查看

Python中的itertools.imap与map的性能方面的对比

Python中的itertools.imap与map的性能方面的对比

综合上面的几段的理解,上面的代码,其实跟下面的是等价的, 有了上面的知识打底,方案三就很理解!

>>> import itertools
>>> ### 方案一: 
>>> def func(x, y):
...     return x * y
...
>>> for i in itertools.imap(func, [10, 20, 30], [1, 2, 3]):
...     print(i)
...
10
40
90
>>> ### 方案二:
>>> for i in itertools.imap(func, [10, 20, 30], itertools.count(start=1, step=1)):
...     print(i)
...
10
40
90
>>> ### 方案三:
>>> for i in itertools.imap(lambda x,y:x*y, [10, 20, 30], itertools.count(1)):
...     print(i)
...
10
40
90
>>>

有了上面的理解,接着可以引出下面一段代码:

>>> for i in map(lambda x, y: x * y, [10, 20, 30], [1, 2, 3]):
...     print(i)
...
10
40
90
>>>

其实上面的一段可以跟iterools.imap, itertool.count效果一样,那么为什么要用itertools.imap和itertools.count呢? 这里面就涉及到一个性能方面的问题, 当列表比较小时,你几乎看不出两者的区别,但如果列表一大,两者的区别的就大了!

>>> data = xrange(1000000000)
>>> doubled = map(lambda x: x * 2, data)     # 会造成MemoryError

而使用itertools.imap则不仅仅可以计算出doubled,而且可以求出其和!

>>> import itertools
>>> data = xrange(1000000000)
>>> iter_doubled = itertools.imap(lambda x: x * 2, data)
>>> sum(iter_doubled)                        # 大概1-10分钟就可以算出结果
999999999000000000L

由此可见, 在处理大数据方面,通过itertools的迭代工具来处理的话,效率要高的多! 

备注: 在Python3中map相当于itertools.imap的迭代函数,所以在3中,下面的代码执行起来是一样的。

>>> data = range(1000000000)
>>> doubled = map(lambda x: x * 2, data)
>>> sum(doubled)
999999999000000000
>>>