python的any()函数背后的诀窍是什么?

时间:2011-10-19 02:45:30

标签: python performance

其中一个pycon2011 talks分享了这个any()功能技巧;解释是循环在C中。

有人可以解释一下吗?它背后有什么诀窍,还有其他用例吗?

>>> import itertools, hashlib, time
>>> _md5 = hashlib.md5()
>>> def run():
...   for i in itertools.repeat('foo', 10000000):
...     _md5.update(i)
... 
>>> a = time.time(); run(); time.time() -a
3.9815599918365479
>>> _md5 = hashlib.md5()
>>> def run():
...   any(itertools.imap(_md5.update, itertools.repeat('foo', 10000000)))
... 
>>> a = time.time(); run(); time.time() -a
2.1475138664245605
>>> 

2 个答案:

答案 0 :(得分:4)

itertools.imap创建一个惰性列表,其中包含要评估的函数(md5)和它的参数('foo'string)。此时不会对md5调用进行评估,而是与它们的参数一起准备(我认为它们被称为thunks)。然后,当您将此迭代器传递给任何函数时,它将遍历评估它们的所有元素。这比第一个程序中的显式Python评估更快,因为any在C中实现,并且所有内容都在C库代码中发生,而不会在每个迭代器元素之后返回到解释器。

答案 1 :(得分:0)