[問題] for迴圈在function內外的速度差別

作者: bamboopole (竹竿)   2021-09-14 13:48:07
#更2021/09/14
感謝各位大大的支援
詳細可以看sooge大的那篇文
for i in range()
如果是包在function裡
那個i 會使用 STORE_FAST
當執行到FOR_ITER時
會預測下一個指令為STORE_FAST
所以會直接peek到再下一個opcode
但 STORE_NAME 不會
包在function裡
STORE_FAST
https://i.imgur.com/yNTNuHN.jpg
如果沒包的話會是用 STORE_NAME
https://i.imgur.com/8ml1USm.jpg
圖中的TOS是 Top-of-stack
==============================
如題
我想知道在function內外執行速度上會不好有差異
func()是隨便寫的
然後for迴圈重複執行func()
一支程式是直接寫在外面執行
另一支是寫一個main() function去執行
直接在外面執行
https://i.imgur.com/wxDf04N.jpg
寫在main()去執行
https://i.imgur.com/RxNR7wP.jpg
執行後發現是寫在main()裡的執行的比較快
https://i.imgur.com/x9S8rez.jpg
我想請問為什麼會有這個速度上的差別
我猜測是因為range(10000000)
我有 print( id(10000000))
我發現那個1000000是有記憶體位置的
所以是因為那個10000000如果寫在main裡會是local變數
而local變數讀取比較快
是這樣嗎?
作者: lycantrope (阿寬)   2021-09-14 14:59:00
只測一次不準,而且要用time.perf_counter比較精確
作者: bamboopole (竹竿)   2021-09-14 15:12:00
我測滿多次了,差不多都是這個數字time.perf_counter 我在試試看!感謝
作者: s0914714 (YA)   2021-09-14 15:53:00
看不出來有啥差 不過一般來說存取local是會比global快可以用dis.dis看一下指令長怎樣
作者: pmove (金疾檸檬)   2021-09-14 17:15:00
我自己實測也是類似原po的結果,但不知道主因是啥?
作者: s0914714 (YA)   2021-09-14 18:09:00
測試了一下 包在function for的i對應指令是STORE_FAST沒包成function for的i指令是STORE_NAME 應該是差在這還有call function時 包-LOAD_GLOBAL 不包-LOAD_NAME實際狀況可能要請其他人補充 因為我也只是猜測
作者: kurapica1106   2021-09-14 18:28:00
測試結果跟原PO一樣
作者: sooge (老衲)   2021-09-14 18:52:00
作者: jeff082   2021-09-19 17:33:00
10000000 當然有記憶體位置啊,python裡的一切都是物件

Links booklink

Contact Us: admin [ a t ] ucptt.com