全局变量在循环中反复读取会拖慢速度,因每次需查全局命名空间;应将全局函数或方法绑定为局部变量以避免重复属性查找。

global 变量在循环里反复读取,确实会拖慢执行速度——Python 每次都要去全局命名空间查一遍,比局部变量慢 2–3 倍。直接把要用的全局东西“拉进函数内部”,就能绕过这层查找开销。
把模块函数绑定为局部变量
常见错误是写 math.sqrt(x) 或 os.path.join(a, b) 这类调用,在循环里反复触发属性查找。
- 错:每次循环都走
math→sqrt两层字典查找 - 对:提前用
from math import sqrt,或在函数开头赋值sqrt = math.sqrt - 更优:连
append都提出来,比如apd = result.append,避免每次result.append(x)查result对象再查append方法
示例:
def compute_sqrt(nums):
from math import sqrt # 局部导入,避免全局模块查找
result = []
apd = result.append # 绑定方法到局部名
for n in nums:
apd(sqrt(n)) # 无属性查找,纯函数调用
return result避免在循环条件里重复计算全局值
比如 while i ,每次迭代都重新调用 <code>len() —— 虽然 len 很快,但仍是不必要的全局函数调用。
立即学习“Python免费学习笔记(深入)”;
- 错:
for i in range(len(items)):(两次全局查找:range和len) - 对:
n = len(items); for i in range(n):(len只算一次) - 更推荐:
for item in items:(不涉及索引就别用range(len(...)))
用 __slots__ 减少实例属性访问开销
如果你在循环里大量创建类实例,并频繁读写属性(如 obj.x),默认的 __dict__ 查找会成为瓶颈。
- 错:普通类,每次
obj.x都要查obj.__dict__ - 对:加
__slots__ = ['x', 'y'],属性直接映射到固定内存偏移,访问快且省内存 - 注意:
__slots__禁止动态添加属性,也影响继承行为,别在需要__dict__的场景硬套
别迷信“所有全局都要转局部”
过度优化可能让代码变脆、难读,尤其当变量本身变化频繁或逻辑耦合深时。
- 真正该提的:稳定、高频、只读的全局引用(如
math.pi、re.compile(...)) - 不该提的:依赖外部状态的函数(如
time.time())、可能被 monkey patch 的模块方法 - 优先测:用
line_profiler看哪行真耗时,而不是凭经验瞎提
最常被忽略的是:局部化不是目的,减少解释器运行时查找才是。很多“优化”只是把问题从一处挪到另一处,没动根子。


















