局部变量提升执行效率
看到的一篇文章,在python中如何提升执行的效率,故简单的记录一下,自己验证的过程,原文链接。
虽然自己在使用其他语言的时候,也知道,“局部变量”比“全局”变量访问速度快,对象的属性方法,直接使用一个局部变量的简单的方式引用,可以提升速度,但是从未验证过。以下包含自己验证的数据。
(可能并非适用所有语言,比如像lua这种栈虚拟机语言,?)
局部变量性能提升对比
全局变量
import math
def compute_sqrt(nums):
result = []
for n in nums: # 假如nums长度很大
# 1. math.sqrt 会被频繁访问
# 2. result.append 也会被频繁访问
result.append(math.sqrt(n))
return result
%timeit compute_sqrt(range(100000000))
%timeit compute_sqrt(range(100000000))
改用局部变量,提升执行速度
def compute_sqrt2(nums):
# 调整sqrt为局部变量
from math import sqrt
result = []
apd = result.append
for n in nums: # 假如nums长度很大
# 1. math.sqrt 会被频繁访问
# 2. result.append 也会被频繁访问
apd(sqrt(n))
return result
%timeit compute_sqrt2(range(100000000))
13.4 s ± 144 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
属性包装
class A:
def __init__(self, x, y):
self.x = x
self.y = y
@property
def y(self):
return self._y
@y.setter
def y(self, value):
self._y = value
因此修改为下面这样,删去多余的@property包装
class A:
def __init__(self, x, y):
self.x = x
self.y = y
结论
非常的有效果,大概提升后,时间60%。
关于代码执行效率的第一个方法是减少频繁的方法访问 尤其是在多层循环内层、且循环次数较多的操作,差距尤为明显。
第二个方法:查找局部变量的效率是最高的!!!对于频繁访问的变量应尽可能是局部变量,消除不必要的全局变量访问。所以对于上面代码,sqrt还是模块级别的全局变量
不要做一些不必要的属性包装。比如@property必要时再用,能不用时就别用。如下对于属性y做@property装饰没有任何意义!