(此問題基于現已洗掉的推文)
我使用 Python3.9 和 Python3.10 運行以下命令:
$ python -m timeit 'tuple([-x for x in range(1000)])'
10000 loops, best of 5: 35.7 usec per loop
$ python -m timeit 'tuple(-x for x in range(1000))'
5000 loops, best of 5: 45.7 usec per loop
令人驚訝的是,構建額外物件(串列)的版本更快。為什么會這樣?如果這確實更快,為什么元組建構式不只是在引擎蓋下實體化一個串列?
注意:我還對長度為 10 和長度為 100 萬的元組進行了計時,并且帶有串列的版本總是更快。
uj5u.com熱心網友回復:
試試這個:
python -m timeit 'list(-x for x in range(1000))'
我預測您會發現它需要的時間與您的:
python -m timeit 'tuple(-x for x in range(1000))'
然后
python -m timeit 'list([-x for x in range(1000)])'
將再次恢復“丟失”的速度。
這是因為串列與元組實際上與此無關。它而不是tuple()
和list()
只是函式呼叫到Python,并可以呼叫任何東西(默認情況下,這些名稱被系結到內置的功能,但用戶可以將它們重新系結到任何東西)。
但是[expression for vrb in ...]
是專用語法,其含義用戶代碼不能改變。Python 在編譯時就知道它正在構建一個串列,并生成特殊的代碼來利用它。該代碼從不呼叫list()
,而是直接自己構建串列,一次一個元素。實際上沒有構造生成器運算式,并且從生成器運算式一次生成一個元素也沒有開銷。
構建包含這些型別運算式的簡單函式并用于dis.dis()
顯示生成的位元組碼。代碼非常不同:-)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/402190.html