【问题标题】:What's the optimal way to use global variables?使用全局变量的最佳方式是什么?
【发布时间】:2022-01-01 08:00:29
【问题描述】:

python 中的 global 变量比 local 慢的事实很漂亮 well known 并且已经在本网站的不同问题中进行了讨论。但是,我还没有找到答案的一件事是,在代码?

到目前为止,我能找到的最佳解决方案是定义一个 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 解决方法,最好的方法是什么?

【问题讨论】:

  • global实际上是python中的一个关键字。
  • globals()['number']?

标签: python global-variables


【解决方案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

【讨论】:

  • 添加更多细节(这个答案没有澄清),但这个版本和fglobal_wrapper 之间的唯一区别是原始版本创建并返回一个新函数;由于 global_number 实际上在闭包中,而不是在这种情况下的函数 locals 中,所以它在 timeit 上运行得更慢。在这种方法中,global_number 显式在函数 locals() 中,因此它运行得更快一些,因为 python 在检查函数 locals 时已经找到它,所以它不需要检查其他作用域,如闭包和全局变量来查找 @987654325 @。希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2016-09-18
  • 2010-10-01
  • 2010-10-12
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多