В чем заключается хитрость функции Python any ()? - PullRequest
3 голосов
/ 19 октября 2011

Один из сообщений 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
>>> 

Ответы [ 2 ]

4 голосов
/ 19 октября 2011

itertools.imap создает ленивый список, который содержит функцию для оценки (md5) и ее аргумент (строка 'foo'). На этом этапе вызовы md5 не оцениваются, а подготавливаются вместе с их аргументами (я думаю, что они называются thunks). Когда вы затем передаете этот итератор любой функции, он проходит через все элементы, оценивающие их. Это происходит быстрее, чем явная оценка Python из первой программы, потому что any реализован на C, и все происходит в коде библиотеки C без возврата к интерпретатору после каждого элемента итератора.

0 голосов
/ 19 октября 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...