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字节码要快。