python程序在函数内执行得更快
http://www.cnblogs.com/nepaul/archive/2012/07/15/2592179.html
為什么Python程序在函數(shù)內(nèi)執(zhí)行得更快?(來源StackOverflow)
考慮下面的代碼,一個(gè)在函數(shù)體內(nèi),一個(gè)是全局的代碼。
函數(shù)內(nèi)的代碼執(zhí)行效率為 1.8s
| 1 2 3 4 | def?main(): ????for?i in?xrange(10**8): ????????pass main() |
函數(shù)體外的代碼執(zhí)行效率為 4.5s
| 1 2 | for?i in?xrange(10**8): ????pass |
不用太糾結(jié)時(shí)間,只是一個(gè)示例,我們可以看到效率查得很多。為什么會這樣呢?我們使用?dis?module?反匯編函數(shù)體內(nèi)的bytecode 代碼,使用?compile?builtin?反匯編全局bytecode,我們可以看到下面的反匯編(注意我高亮的地方)
| 1 2 3 | 13 FOR_ITER ? ? ? ? ? ? ? ? 6 (to 22) 16 STORE_FAST ? ? ? ? ? ? ? 1 (i) 19 JUMP_ABSOLUTE ? ? ? ? ? 13 |
| 1 2 3 | 13 FOR_ITER ? ? ? ? ? ? ? ? 6 (to 22) 16 STORE_NAME ? ? ? ? ? ? ? 1 (i) 19 JUMP_ABSOLUTE ? ? ? ? ? 13 |
我們可以看到,差別就是?STORE_FAST?和?STORE_NAME,前者比后者快很多。所以,在全局代碼中,變量i成了一個(gè)全局變量,而函數(shù)中的i是放在本地變量表中,所以在全局變量表中查找變量就慢很多。如果你在main函數(shù)中聲明global i 那么效率也就下來了。原因是,本地變量是存在一個(gè)數(shù)組中(直到),用一個(gè)整型常量去訪問,而全局變量存在一個(gè)dictionary中,查詢很慢。
(注:在C/C++中,這個(gè)不是一個(gè)問題)
轉(zhuǎn)載于:https://www.cnblogs.com/lvxiuquan/archive/2013/05/15/3079546.html
總結(jié)
以上是生活随笔為你收集整理的python程序在函数内执行得更快的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell命令--tail
- 下一篇: UILabel 详解