使用全局变量的最佳方式是什么?

What's the optimal way to use global variables?

提问人:aviro 提问时间:11/23/2021 最后编辑:martineauaviro 更新时间:11/23/2021 访问量:106

问:

变量比变量慢的事实是众所周知的,并且已经在本网站的不同问题中进行了讨论。但是,我仍然没有找到答案的一件事是,使用代码中不同函数中使用的变量(例如,python中不存在的概念)的最佳和最快的方法是什么?globalpythonlocalglobalconstant

到目前为止,我能找到的最佳解决方案是定义一个函数,在该函数中,我将全局变量分配给局部变量。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

python 全局变量

评论

0赞 Jab 11/23/2021
global实际上是 Python 中的一个关键字。
0赞 CJR 11/23/2021
globals()['number']?

答:

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_wrapperlocals()global_number