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