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



pycon2011的一个演讲分享了这个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
>>> 

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

本质上没有什么"窍门";运行编译后的C代码比运行Python字节码要快。

最新更新