作者bamboopole (ㄈㄓ肥竹)
看板Python
标题[问题] for回圈在function内外的速度差别
时间Tue Sep 14 13:48:07 2021
#更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://webptt.com/cn.aspx?n=bbs/Python/M.1631598489.A.874.html
1F:推 lycantrope: 只测一次不准,而且要用time.perf_counter比较精确 09/14 14:59
2F:→ bamboopole: 我测满多次了,差不多都是这个数字 09/14 15:12
3F:→ bamboopole: time.perf_counter 我在试试看!感谢 09/14 15:12
4F:推 s0914714: 看不出来有啥差 不过一般来说存取local是会比global快 09/14 15:53
5F:→ s0914714: 可以用dis.dis看一下指令长怎样 09/14 15:53
6F:推 pmove: 我自己实测也是类似原po的结果,但不知道主因是啥? 09/14 17:15
7F:推 s0914714: 测试了一下 包在function for的i对应指令是STORE_FAST 09/14 18:09
8F:→ s0914714: 没包成function for的i指令是STORE_NAME 应该是差在这 09/14 18:09
9F:推 s0914714: 还有call function时 包-LOAD_GLOBAL 不包-LOAD_NAME 09/14 18:15
10F:→ s0914714: 实际状况可能要请其他人补充 因为我也只是猜测 09/14 18:16
11F:推 kurapica1106: 测试结果跟原PO一样 09/14 18:28
12F:推 sooge: 自己看 09/14 18:52
※ 编辑: bamboopole (180.217.72.178 台湾), 09/14/2021 21:46:13
14F:推 jeff082: 10000000 当然有记忆体位置啊,python里的一切都是物件 09/19 17:33