提问人:aviro 提问时间:11/23/2021 最后编辑:martineauaviro 更新时间:11/23/2021 访问量:106
使用全局变量的最佳方式是什么?
What's the optimal way to use global variables?
问:
变量比变量慢的事实是众所周知的,并且已经在本网站的不同问题中进行了讨论。但是,我仍然没有找到答案的一件事是,使用代码中不同函数中使用的变量(例如,python中不存在的概念)的最佳和最快的方法是什么?global
python
local
global
constant
到目前为止,我能找到的最佳解决方案是定义一个函数,在该函数中,我将全局变量分配给局部变量。closure
from timeit import timeit
number = 10
def flocal():
number = 10
for i in range(25):
x = number
def fglobal():
for i in range(25):
x = number
def fglobal_wrapper():
global_number = number
def actual_func():
for i in range(25):
x = global_number
return actual_func
fclosure = fglobal_wrapper()
print("local: %.3f" % timeit("flocal()", "from __main__ import flocal"))
print("global: %.3f" % timeit("fglobal()", "from __main__ import fglobal"))
print("closure: %.3f" % timeit("fclosure()", "from __main__ import fclosure"))
输出:
local: 0.681
global: 0.806
closure: 0.728
但这是一个丑陋的解决方案,而且它仍然比使用局部变量慢。在函数中使用全局/常量变量等效项,而不必将它们作为参数传递给函数或此解决方法的最知名方法是什么?closure
答:
1赞
lejlot
11/23/2021
#1
def fglobal2():
global_number = number # single access to global
for i in range(25):
x = global_number
在我的机器上与本地一样快(我运行了 10 倍以上的测试,以减少时间估计中的噪音)
local: 4.409
global: 4.914
global2: 4.406 # proposed, as fast as local
closure: 4.560
评论
0赞
rv.kvetch
11/23/2021
添加更多细节(这个答案没有澄清),但这个版本和之间的唯一区别是原始版本创建并返回一个新的函数;由于global_number实际上在闭包中,而不是在这种情况下在函数局部变量中,因此它在 TimeIt 中的运行速度较慢。在这种方法中,global_number 显式地在 function 中,因此它的运行速度要快一些,因为 python 在检查函数局部变量时已经找到了它,因此它不需要检查其他范围,例如闭包和全局变量来查找。希望这会有所帮助。fglobal_wrapper
locals()
global_number
上一个:继承带有双下划线的类属性
评论
global
实际上是 Python 中的一个关键字。globals()['number']
?