为什么在Python代码中使用局部变量会更快

简介: 在Python开发中,一个常见的效率优化方法就是在进入循环之前,使用局部变量来替代全局变量。具体的,可以对比下面的两个函数: g = 2 def local_var(): global g l = g for i in range(100000000): .

在Python开发中,一个常见的效率优化方法就是在进入循环之前,使用局部变量来替代全局变量。具体的,可以对比下面的两个函数:

g = 2

def local_var():
    global g
    l = g
    for i in range(100000000):
        i % l
        i + l

def global_var():
    global g
    for i in range(100000000):
        i % g
        i + g

在这个大循环中,global_var采用了全局变量,而local_var中则先用l = g把全局变量放到了局部变量里。我们可以通过timeit模块来获取他们的运行时间,比如

>>> import timeit
>>> timeit.timeit(local_var, number=1, globals=globals())
6.773113199975342
>>> timeit.timeit(global_const, number=1, globals=globals())
6.331308399792761

如果多次比较,会发现local_var确实明显要比global_var快一些。为了分析原因,我们可以用dis模块来分别反编译这两个函数的Python中间代码,放在下面进行对比:

dis.dis(local_var) dis.dis(global_var)
  3           0 LOAD_GLOBAL              0 (g)
              2 STORE_FAST               0 (l)

  4           4 SETUP_LOOP              32 (to 38)
              6 LOAD_GLOBAL              1 (range)
              8 LOAD_CONST               1 (100000000)
             10 CALL_FUNCTION            1
             12 GET_ITER
        >>   14 FOR_ITER                20 (to 36)
             16 STORE_FAST               1 (i)

  5          18 LOAD_FAST                1 (i)
             20 LOAD_FAST                0 (l)
             22 BINARY_MODULO
             24 POP_TOP

  6          26 LOAD_FAST                1 (i)
             28 LOAD_FAST                0 (l)
             30 BINARY_ADD
             32 POP_TOP
             34 JUMP_ABSOLUTE           14
        >>   36 POP_BLOCK
        >>   38 LOAD_CONST               0 (None)
             40 RETURN_VALUE

  3           0 SETUP_LOOP              32 (to 34)
              2 LOAD_GLOBAL              0 (range)
              4 LOAD_CONST               1 (100000000)
              6 CALL_FUNCTION            1
              8 GET_ITER
        >>   10 FOR_ITER                20 (to 32)
             12 STORE_FAST               0 (i)

  4          14 LOAD_FAST                0 (i)
             16 LOAD_GLOBAL              1 (g)
             18 BINARY_MODULO
             20 POP_TOP

  5          22 LOAD_FAST                0 (i)
             24 LOAD_GLOBAL              1 (g)
             26 BINARY_ADD
             28 POP_TOP
             30 JUMP_ABSOLUTE           10
        >>   32 POP_BLOCK
        >>   34 LOAD_CONST               0 (None)
             36 RETURN_VALUE

比较发现,两个函数的主要区别在于循环中,local_var使用的是LOAD_FAST指令儿global_var中使用的是LOAD_GLOBAL指令。在Python的解释器执行中,因为LOAD_GLOBAL要在全局的字典中进行查找,所以LOAD_GLOBAL要比LOAD_FAST慢不少。这应该就是采用局部变量这一优化方法可以让Python程序更快的原因了。所以,养成在进入大规模的循环之前,用局部变量还是替代全局变量的习惯,还是相当有必要的。

目录
相关文章
|
9天前
|
监控 Python
Python中的装饰器:提升代码灵活性与可读性
在Python编程中,装饰器是一种强大的工具,能够提升代码的灵活性和可读性。本文将介绍装饰器的基本概念、使用方法以及实际应用场景,帮助读者更好地理解和利用这一功能。
|
12天前
|
人工智能 数据可视化 数据挖掘
【python】Python航空公司客户价值数据分析(代码+论文)【独一无二】
【python】Python航空公司客户价值数据分析(代码+论文)【独一无二】
|
17天前
|
数据采集 JSON 数据可视化
【python】python懂车帝数据可视化(代码+报告)
【python】python懂车帝数据可视化(代码+报告)
|
16天前
|
机器学习/深度学习 算法 搜索推荐
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
|
10天前
|
缓存 监控 算法
优化Python代码性能的10个技巧
提高Python代码性能是每个开发者都需要关注的重要问题。本文将介绍10个实用的技巧,帮助你优化Python代码,提升程序的运行效率和性能表现。无论是避免内存泄漏、减少函数调用次数,还是使用适当的数据结构,都能在不同场景下发挥作用,使你的Python应用更加高效稳定。
|
2天前
|
数据安全/隐私保护 Python
Python中的装饰器:提升代码可读性与灵活性
Python中的装饰器是一种强大的工具,可以在不改变函数原有逻辑的情况下,为函数添加额外的功能。本文将介绍装饰器的基本概念和用法,并通过实例演示如何利用装饰器提升代码的可读性和灵活性,使代码更加简洁、易于维护。
|
2天前
|
BI 开发者 数据格式
Python代码填充数据到word模板中
【4月更文挑战第16天】
|
4天前
|
缓存 算法 Python
优化Python代码的十大技巧
本文介绍了十种优化Python代码的技巧,涵盖了从代码结构到性能调优的方方面面。通过学习和应用这些技巧,你可以提高Python程序的执行效率,提升代码质量,以及更好地应对复杂的编程任务。
|
4天前
|
程序员 Python
Python中的装饰器:提升代码可读性与灵活性
在Python编程中,装饰器是一种强大的工具,可以在不修改原始代码的情况下,动态地添加功能。本文将深入探讨Python中装饰器的原理、用法和实际应用,以及如何利用装饰器提升代码的可读性和灵活性。
|
6天前
|
缓存 开发者 Python
深入探讨Python中的装饰器:提升代码可读性与灵活性
在Python编程中,装饰器是一种强大的工具,可以在不修改原始函数代码的情况下,对其行为进行扩展或修改。本文将深入探讨装饰器的原理和用法,以及如何利用装饰器提升代码的可读性和灵活性,为Python开发者提供更加优雅和高效的编程方式。