先来理解看下一段代码:
>>> 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()函数来查看
综合上面的几段的理解,上面的代码,其实跟下面的是等价的, 有了上面的知识打底,方案三就很理解!
>>> 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
>>>