#
事情是这样的, 我写的一个程序帧率上不去.
然后发现了一个疑似有问题的地方, 如下
- 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 的 "多次创建"
来源: http://www.bubuko.com/infodetail-3056799.html