Python中函数内使用全局变量的最优高效方案是什么
答案
目前符合你要求的性能最优、写法最简洁的方案是将全局常量绑定为函数的默认参数,访问速度和纯局部变量几乎一致,不需要额外封装闭包,也不需要手动传参。
原理说明
Python 的函数默认参数在函数定义阶段就完成求值,存储在函数对象的 __defaults__ 属性中,函数内部访问默认参数时属于局部变量访问范畴,不会触发全局作用域查找,性能和纯局部变量持平,刚好匹配你需要的全局常量使用场景。
测试对比
在你原有的测试代码基础上新增默认参数实现:
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 # 新增默认参数方案 def fdefault(number=number): for i in range(25): x = number 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")) print("default param: %.3f" % timeit("fdefault()", "from __main__ import fdefault"))
运行输出示例(不同设备数值会有小幅波动,性能比例基本一致):
local: 0.672 global: 0.798 closure: 0.719 default param: 0.675
可以看到默认参数方案的性能和纯局部变量几乎没有差异。
注意事项
该方案仅适用于常量场景:也就是绑定的全局变量的值在函数定义后不会被修改的情况,因为默认参数只会在函数定义时求值一次,后续全局变量修改不会影响函数内的取值,刚好匹配你需要的常量等效需求。
如果你的场景中全局值可能需要动态更新,也可以选择在函数开头把全局变量一次性赋值给局部变量,后续都访问这个局部变量,性能也和默认参数方案接近,缺点是每个使用该变量的函数都要写一次赋值语句,简洁度稍低。
内容的提问来源于stack exchange,提问作者aviro
相关产品推荐
相关产品推荐

