什么';这是python背后的诀窍';有什么()函数吗?
其中一个共享的this什么';这是python背后的诀窍';有什么()函数吗?,python,performance,Python,Performance,其中一个共享的thisany()函数技巧;原因是循环是用C语言编写的 有人能解释一下吗?它背后的诀窍是什么?还有其他用例吗 >>> import itertools, hashlib, time >>> _md5 = hashlib.md5() >>> def run(): ... for i in itertools.repeat('foo', 10000000): ... _md5.update(i) ... >>
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'字符串)。md5调用在这一点上没有进行评估,而是与它们的参数一起准备(我认为它们被称为thunks)。然后,当您将此迭代器传递给任何函数时,它将遍历所有对其求值的元素。这比第一个程序的显式Python计算要快,因为
any
是用C实现的,所有事情都发生在C库代码中,而无需在每个迭代器元素之后返回解释器。如果您发布了一个视频链接,可能会出现重复问题。您不需要any
,事实上,过滤器(_md5.update,itertools.repeat('foo',10000000))
会更快。@tomasz你能告诉我为什么更快吗?