我想出了一些很奇怪的東西。目標是評估迭代的長度。
python -m timeit --setup="x = range(1000)" "x=list(x);len(x)"
1000000 個回圈,最好的 3 個:每個回圈 1.82 微秒
python -m timeit --setup="x = range(1000)" "len(list(x))"
100000 個回圈,最好的 3 個:每個回圈 9.92 微秒
誰能解釋第一種方法更快的原因?
我試圖查看匯編說明,但這無助于理解這種行為。
和: x=list(x);len(x)
>>> dis.dis(meth1)
2 0 LOAD_GLOBAL 0 (list)
2 LOAD_FAST 0 (it)
4 CALL_FUNCTION 1
6 STORE_FAST 1 (x)
3 8 LOAD_GLOBAL 1 (len)
10 LOAD_FAST 1 (x)
12 CALL_FUNCTION 1
14 RETURN_VALUE
與len(list(x)):
>>> dis.dis(meth2)
2 0 LOAD_GLOBAL 0 (len)
2 LOAD_GLOBAL 1 (list)
4 LOAD_FAST 0 (it)
6 CALL_FUNCTION 1
8 CALL_FUNCTION 1
10 RETURN_VALUE
uj5u.com熱心網友回復:
您必須考慮設定只執行一次的事實。
考試
--setup="x = range(1000)" "x=list(x);len(x)"
將范圍轉換為串列并將其存盤回x. 下一次迭代,它已經是一個串列,所以沒有什么可做的了。
如果您將其更改為不同的變數名稱,則差異應該消失:
--setup="x = range(1000)" "something=list(x);len(something)"
在另一個測驗中
--setup="x = range(1000)" "len(list(x))"
x仍然是一個范圍,需要轉換成一個串列100000 次。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314086.html
