局部变量提升执行效率

看到的一篇文章,在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装饰没有任何意义!