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

看板Python作者 (ㄈㄓ肥竹)時間3年前 (2021/09/14 13:48), 3年前編輯推噓8(805)
留言13則, 6人參與, 3年前最新討論串1/1
#更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變數讀取比較快 是這樣嗎? ----- Sent from JPTT on my iPhone -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.217.72.178 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1631598489.A.874.html

09/14 14:59, 3年前 , 1F
只測一次不準,而且要用time.perf_counter比較精確
09/14 14:59, 1F

09/14 15:12, 3年前 , 2F
我測滿多次了,差不多都是這個數字
09/14 15:12, 2F

09/14 15:12, 3年前 , 3F
time.perf_counter 我在試試看!感謝
09/14 15:12, 3F

09/14 15:53, 3年前 , 4F
看不出來有啥差 不過一般來說存取local是會比global快
09/14 15:53, 4F

09/14 15:53, 3年前 , 5F
可以用dis.dis看一下指令長怎樣
09/14 15:53, 5F

09/14 17:15, 3年前 , 6F
我自己實測也是類似原po的結果,但不知道主因是啥?
09/14 17:15, 6F

09/14 18:09, 3年前 , 7F
測試了一下 包在function for的i對應指令是STORE_FAST
09/14 18:09, 7F

09/14 18:09, 3年前 , 8F
沒包成function for的i指令是STORE_NAME 應該是差在這
09/14 18:09, 8F

09/14 18:15, 3年前 , 9F
還有call function時 包-LOAD_GLOBAL 不包-LOAD_NAME
09/14 18:15, 9F

09/14 18:16, 3年前 , 10F
實際狀況可能要請其他人補充 因為我也只是猜測
09/14 18:16, 10F

09/14 18:28, 3年前 , 11F
測試結果跟原PO一樣
09/14 18:28, 11F

09/14 18:52, 3年前 , 12F
自己看
09/14 18:52, 12F

09/14 18:55, 3年前 , 13F
09/14 18:55, 13F
※ 編輯: bamboopole (180.217.72.178 臺灣), 09/14/2021 21:46:13
文章代碼(AID): #1XG3UPXq (Python)
文章代碼(AID): #1XG3UPXq (Python)