http://www.cnblogs.com/nepaul/archive/2012/07/15/2592179.html
為什么Python程序在函數內執行得更快?(來源StackOverflow)
考慮下面的代碼,一個在函數體內,一個是全局的代碼。
函數內的代碼執行效率為 1.8s
1 2 3 4 | def ?main(): ???? for ?i in ?xrange ( 10 * * 8 ): ???????? pass main() |
函數體外的代碼執行效率為 4.5s
1 2 | for ?i in ?xrange ( 10 * * 8 ): ???? pass |
不用太糾結時間,只是一個示例,我們可以看到效率查得很多。為什么會這樣呢?我們使用?dis
?module?反匯編函數體內的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成了一個全局變量,而函數中的i是放在本地變量表中,所以在全局變量表中查找變量就慢很多。如果你在main函數中聲明global i 那么效率也就下來了。
原因是,本地變量是存在一個數組中(直到),用一個整型常量去訪問,而全局變量存在一個dictionary中,查詢很慢。
(注:在
C/C++中,這個不是一個問題)