[英]what's the trick behind python's any() function?
其中一個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'字符串)。 此時不對md5調用進行評估,而是與它們的參數一起准備(我認為它們被稱為thunks)。 然后,當您將此迭代器傳遞給任何函數時,它將遍歷評估它們的所有元素。 這比第一個程序中的顯式Python評估更快,因為any
都是在C中實現的,並且所有內容都發生在C庫代碼中,而不會在每個迭代器元素之后返回到解釋器。
本身沒有“詭計”; 運行編譯的C代碼比運行Python字節碼更快 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.