Python笔记:loop循环优化(有删改)

我们知道,循环是一次一次的执行我们的要求,优化的关键点就是最小化循环的工作量*(当然只有循环次数大的时候才有意义,太小的优化效果几乎忽略不计)*。

如下为一个典型的loop循环:

import random
lowerlist = ['abcdefghijklmnopqrstuvwxyz'[:random.randint(0,25)] for x in range(1000)]
upperlist = []def to_upper_1():
    for word in lowerlist:
        upperlist.append(str.upper(word))

upperlist = to_upper_1()

# jupyter, timeit结果如下:
284 µs ± 81.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

可以看到,该循环有2个对象upperlsit.appendstr.upper,因为这2个对象有.这个引用符号,它的计算开销在循环次数高的时候,会凸显出来——这是很多人很多时候都没有注意到的。

"""减少.带来的搜索开销:"""
upper = str.upper
append = upperlist.append

def to_upper_2():
    for word in lowerlist:
        append(upper(word))
        
upperlist = to_upper_2()

# jupyter, timeit结果如下:
187 µs ± 48.8 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

这里,upperlistupperappendglobel变量,进一步优化的方法是,变为函数内部的local变量——python的读取效率更高。

def to_upper_3():
	upperlist = []
	upper = str.upper
	append = upperlist.append
    for word in lowerlist:
        append(upper(word))
    return upperlist
        
upperlist = to_upper_3()

# jupyter, timeit结果如下:
96.6 µs ± 718 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

不过这样一来,可读性就变差了。

另一个优化的途径是,直接替换掉循环:

lowerlist = ['abcdefghijklmnopqrstuvwxyz'[:random.randint(0,25)] for x in range(1000)]
upperlist=map(str.upper, lowerlist)

# jupyter, timeit结果如下:
19.4 ns ± 0.226 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

或者:

lowerlist = ['abcdefghijklmnopqrstuvwxyz'[:random.randint(0,25)] for x in range(1000)]
upperlist = [str.upper(x) for x in lowerlist]

# jupyter, timeit结果如下:
19.3 ns ± 0.193 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

list方法丝毫不弱于map函数,因为它对于python interpreter来说,就是天生优化好的,甚至会强于map函数。

PS:numpy才是最快的,能用numpy的就用numpy

你可能感兴趣的:(Python,笔记)