当前位置: 首页 > 面试题库 >

全局变量与局部变量的性能

薛栋
2023-03-14
问题内容

我还是Python的新手,我一直在尝试提高Python脚本的性能,因此我在有或没有全局变量的情况下对其进行了测试。我给它计时,令我惊讶的是,它在声明了全局变量的情况下运行得更快,而不是将局部变量传递给函数。这是怎么回事?我以为局部变量的执行速度更快?(我知道全球人并不安全,我仍然很好奇。)


问题答案:

当地人应该更快

根据此页面上的本地人和全球人:

当一行代码要求输入变量x的值时,Python将在所有可用的名称空间中按以下顺序搜索该变量:

  • 本地名称空间 -特定于当前函数或类方法。如果函数定义了局部变量x或具有参数x,Python将使用该变量并停止搜索。
  • 全局名称空间 -特定于当前模块。如果模块定义了名为x的变量,函数或类,Python将使用该变量,函数或类并停止搜索。
  • 内置名称空间 -所有模块都是全局的。作为最后的选择,Python将假定x是内置函数或变量的名称。

基于此,我假设局部变量通常更快。我的猜测是,您所看到的是脚本的某些特定之处。

当地人更快

这是一个使用局部变量的简单示例,这在我的机器上大约需要0.5秒(Python 3中为0.3秒):

def func():
    for i in range(10000000):
        x = 5

func()

而全局版本大约需要0.7(Python 3中为0.5):

def func():
    global x
    for i in range(1000000):
        x = 5

func()

global 对已经是全局变量的变量做了一些奇怪的事情

有趣的是,此版本的运行时间为0.8秒:

global x
x = 5
for i in range(10000000):
    x = 5

尽管此版本在0.9中运行:

x = 5
for i in range(10000000):
    x = 5

您会注意到,在这两种情况下,x都是全局变量(因为没有函数),并且它们都比使用局部变量慢。我不知道为什么global x在这种情况下声明有所帮助。

这种怪异在Python 3中不会发生(两个版本大约需要0.6秒)。

更好的优化方法

如果要优化程序,最好的方法是分析程序。这将告诉您花费最多的时间,因此您可以专注于此。您的过程应类似于:

  1. 启用概要分析后运行程序。
  2. 查看KCacheGrind或类似程序中的配置文件,以确定哪些功能花费的时间最多。
  3. 在这些功能中:
    • 寻找可以缓存函数结果的位置(因此您不必做太多工作)。
    • 寻找算法上的改进,例如用闭式函数替换递归函数,或用字典替换列表搜索。
    • 重新配置文件,以确保该功能仍然存在问题。
    • 考虑使用多重处理。


 类似资料:
  • 问题内容: 我了解Python中局部变量和全局变量的概念,但是我只是有一个问题,为什么下面的代码中会出现错误?Python逐行执行代码,因此在读取第5行之前,它不知道a是局部变量。Python尝试执行第5行后,会回退一行并将其标记为错误吗? 问题答案: 设置和测试 为了分析您的问题,让我们创建两个独立的测试函数来复制您的问题: 版画。因此,调用此函数不是问题,而是在下一个函数上: 我们收到一个错误

  • 主要内容:局部变量,全局变量,局部变量和全局变量的综合示例在《 C语言形参和实参的区别》中提到,形参变量要等到函数被调用时才分配内存,调用结束后立即释放内存。这说明形参变量的作用域非常有限,只能在函数内部使用,离开该函数就无效了。 所谓 作用域( Scope ) ,就是变量的有效范围。 不仅对于形参变量,C语言中所有的变量都有自己的作用域。决定变量作用域的是变量的定义位置。 局部变量 定义在函数内部的变量称为 局部变量(Local Variable) ,

  • 本文向大家介绍浅谈JavaScript的全局变量与局部变量,包括了浅谈JavaScript的全局变量与局部变量的使用技巧和注意事项,需要的朋友参考一下 一、JavaScript scope 的划分标准是function函数块,不是以 if、while、for来划分的 二、JavaScript在执行之前会对整个脚本文件进行预编译(对脚本文件的声明部分做分析,包括局部变量部分),从而确定实变量的作用域

  • 问题内容: 此代码为何起作用: 但这给出了“分配前引用的局部变量’var’”错误: 问题答案: 因为在第一个代码中,您已经创建了一个局部变量并使用了它的值,而在第二个代码中,您正在使用局部变量,而没有对其进行定义。 因此,如果要使第二个功能正常工作,则需要声明:- 在使用该功能之前。 而在此代码中: 更新 :- 但是,按照@Tim的注释,您不应在函数内部使用变量。最好在使用变量之前先定义变量,然后

  • 主要内容:Python局部变量,Python全局变量,获取指定作用域范围中的变量所谓 作用域(Scope),就是变量的有效范围,就是变量可以在哪个范围以内使用。有些变量可以在整段代码的任意位置使用,有些变量只能在函数内部使用,有些变量只能在 for 循环内部使用。 变量的作用域由变量的定义位置决定,在不同位置定义的变量,它的作用域是不一样的。本节我们只讲解两种变量, 局部变量和 全局变量。 Python局部变量 在函数内部定义的变量,它的作用域也仅限于函数内部,出了函数就不能

  • 和 C 语言一样,按照变量的作用域,我们可以把变量划分为局部变量和全局变量 Go 语言中局部变量的概念以及全局变量的概念和C语言一模一样 局部变量: 定义在函数内部的变量以及函数的形参称为局部变量 作用域:从定义哪一行开始直到与其所在的代码块结束 生命周期:从程序运行到定义哪一行开始分配存储空间到程序离开该变量所在的作用域 全局变量: 定义在函数外面的变量称为全局变量 作用域范围:从定义哪行开始直