作者:平凡兔子007 | 来源:互联网 | 2023-09-24 18:44
#事情是这样的,我写的一个程序帧率上不去。然后发现了一个疑似有问题的地方,如下defaround(x,y):around_dict{(i,j)foriinrange(-1,2)fo
#
事情是这样的,我写的一个程序帧率上不去。
然后发现了一个疑似有问题的地方,如下
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的“多次创建”
我是ansver我的answer只能信一半