当前位置: 首页 > 知识库问答 >
问题:

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

许承悦
2023-03-14

事实上python中的全局变量比本地变量慢,这是众所周知的,并且已经在本网站的不同问题中讨论过了。然而,我仍然没有找到答案的一件事是,使用代码中不同函数内部使用的全局变量(如常量)的最佳和最快的方法是什么?

到目前为止,我能找到的最佳解决方案是定义一个闭包函数,在这里我将全局变量分配给局部变量

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

但这是一个丑陋的解决方案,而且比使用局部变量还要慢。在函数内部使用全局/常量变量等效的最著名的方法是什么,而不必将它们作为函数的参数传递,或者这种闭包变通方法?

共有1个答案

孔阎宝
2023-03-14
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
 类似资料:
  • 问题内容: 我只想在多个地方使用a :不仅是视图和控制器,而且还包括和其他配置文件。 我不想要这样的事情:使用Config类加载配置文件;使用CI 等。 我只想声明一个给定的(它可以是一个常数,但我需要将它作为一个变量),并在所有地方绝对使用它。 实际上…我想知道CI引导程序中哪个PHP文件是第一个要解析的文件,因此我可以在其中引入我的全局变量…但不是核心/系统或不适当的文件,而是“最佳”适合此简

  • 我需要存储一些应该在我的应用程序上随处可见的数据。到目前为止,我知道三种方法来做到这一点: < li >创建一个特殊文件使变量成为全局变量(Dart中的全局变量) < li >使用共享首选项(这里我只想访问数据,不一定要永久存储) 和InheritedWidget 我想知道哪个解决方案(或另一个我不知道的解决方案)在性能和易于实现方面是最好的。

  • 我们这里说的全局变量,着重指的是能够全局动态响应的情况。 说到全局变量,我们首先想到的可能就是vuex,确实,这是最好的实现方式。在uni-app中,我们还可以有其他的实现方式,这里我们做一个抛砖引玉的讨论,当然,我们 推荐的,还是使用uView封装后的vuex的实现方式,它具有配置简单,使用方便的特点。 整体来说,在uni-app中,可以有如下实现全局变量的方式: 本地存储 配置文件 挂载Vue

  • 问题内容: 这个问题已经在这里有了答案 : type()和isinstance()有什么区别? (7个答案) 7年前关闭。 我需要知道Python中的变量是字符串还是字典。以下代码有什么问题吗? 更新 :我接受了avisser的回答(尽管如果有人解释了为什么首选,我会改变主意)。 但是要感谢Nakedfanatic提醒我,使用dict(作为案例陈述)通常比使用if / elif / else系列更

  • 为了让这个布局正常工作,我已经挣扎了好几个小时。 这是我的代码: 每个片段都是一个简单的RelativeLayout(都有相同的视图): 现在我想让它像这样工作: > 1) 无嵌套layout_weight 2)完全没有嵌套(例如嵌套2个第一个片段等) 3)在视图呈现后,不使用代码以编程方式完成。 在我看来,最简洁、可读性最强的方法是将片段1和片段2的方向设置为水平,将片段3设置为垂直,但它不起作

  • 本文向大家介绍static全局变量与普通的全局变量有什么区别?相关面试题,主要包含被问及static全局变量与普通的全局变量有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 static全局变量只初使化一次,防止在其他文件单元中被引用; 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者在存储方式