# 事情是這樣的,我寫的一個程式幀率上不去。 然後發現了一個疑似有問題的地方,如下 這個函數每幀大概會運行幾千次,字典around_dict似乎會被“反覆生成”。如果是的話,那是十分低效的。不如提出來設成全局變數,一次創建反覆使用。 所以寫了下麵的程式驗證是否有這樣的問題 import time g ...
#
事情是這樣的,我寫的一個程式幀率上不去。
然後發現了一個疑似有問題的地方,如下
def around(x,y): around_dict = {(i,j) for i in range(-1,2) for j in range(-1,2) } return sum(list(map(ask,around_dict)))
這個函數每幀大概會運行幾千次,字典around_dict似乎會被“反覆生成”。如果是的話,那是十分低效的。不如提出來設成全局變數,一次創建反覆使用。
所以寫了下麵的程式驗證是否有這樣的問題

import time global_d = {(i,j):i+j for i in range(10) for j in range(10) } def f1(): d = {(i,j):i+j for i in range(10) for j in range(10) } for x , y in d.items(): if x[0] + x[1] != y : print("?") def f2(): for x , y in global_d.items(): if x[0] + x[1] != y : print("?") def f3(): d = global_d.copy() for x , y in d.items(): if x[0] + x[1] != y : print("?") def timer(f): t = time.time() for i in range(10000): f() print('time-'+f.__name__+":"+str(time.time()-t)) for i in range(1,6): print("第%s次"%i) timer(f1) timer(f2) timer(f3)View Code
運行結果
''' 第1次 time-f1:0.29221653938293457 time-f2:0.11273312568664551 time-f3:0.13164758682250977 第2次 time-f1:0.29621100425720215 time-f2:0.10870814323425293 time-f3:0.1356358528137207 第3次 time-f1:0.28024840354919434 time-f2:0.10671043395996094 time-f3:0.14561057090759277 第4次 time-f1:0.29421257972717285 time-f2:0.11868166923522949 time-f3:0.13364267349243164 第5次 time-f1:0.2872304916381836 time-f2:0.10571765899658203 time-f3:0.13763070106506348 '''
f1 是原樣的
f2 是提出來,寫成了全局變數
f3 是每次copy全局變數,然後再用
結論
1,“反覆創建”的問題是存在的,
2,設定為全局變數可以“一次創建多次使用” 可以提高效率,但是不建議對字典進行修改
兩個原因:
a,函數內只能訪問全局變數,不能修改,除非global語句事先聲明
b,函數多次使用的字典均為同一字典,修改後可能影響後邊函數的運行(不像f1那樣多次創建的字典之間“相互隔離”)
3,如果函數要求使用“相互獨立”的字典,f3的“一次創建多次copy”優於f1的“多次創建”