加速查找
1.用set而不是list查找
data = (i**2 + 1 for i in range(10000))
list1 = list(data)
# 低速方法
set1 = set(data)
# 高速方法
2.用dict而不是两个list进行匹配查找
lista = [2*i for i in range(10000)]
listb = [i**2 for i in lista]
# 低速方法
dictab = dict(zip(lisa,listb))
# 高速方法
加速循环
3.优先使用for循环而不是while
4.在循环体重避免重复计算
lista = [2*i for i in range(10000)]
listb = [i/sum(lista) for i in lista]
# 低速方法
sum_a = sum(lista)
listb = [i/sum_a for i in lista]
# 高速方法
加速函数
5.用循环机制代替递归函数
6.用缓存机制加速递归函数
def fib(n):
return (1 if n in (1,2) else fib(n-1)+fib(n-2))
# 低速方法
from functools import lru_cache
@lru_cache(100)
def fib(n):
return (1 if n in (1,2) else fib(n-1)+fib(n-2))
# 高速方法
@functools.lru_cache装饰器
@functools.lru_cache(maxsize=128, typed=False)
这个装饰器实现了备忘的功能,是一项优化技术,把耗时的函数的结果保存起来,避免传入相同的参数时重复计算。lru 是(least recently used)的缩写,即最近最少使用原则。表明缓存不会无限制增长,一段时间不用的缓存条目会被扔掉。
这个装饰器支持传入参数,还能有这种操作的?maxsize 是保存最近多少个调用的结果,最好设置为 2 的倍数,默认为 128。如果设置为 None 的话就相当于是 maxsize 为正无穷了。还有一个参数是 type,如果 type 设置为 true,即把不同参数类型得到的结果分开保存,如 f(3) 和 f(3.0) 会被区分开。
这个装饰器还提供 cache_clear() 用于清理缓存,以及 cache_info() 用于查看缓存信息
7.用numba加速python函数
def my_power(x):
return (x**2)
def my_power_sum(n):
s = 0
for i in range(1, n+1):
s = s + my_power(i)
return (s)
# 低速方法
from numba import jit
@jit
def my_power(x):
return (x**2)
@jit
def my_power_sum(n):
s = 0
for i in range(1, n+1):
s = s + my_power(i)
return (s)
# 高速方法
jit 的全称是 Just-in-time,在 numba 里面则特指 Just-in-time compilation(即时编译)。jit会在某种程度上“预编译”你的代码,这意味着它会在某种程度上固定住各个变量的数据类型.
使用标准库函数进行加速
8.使用collections.Counter加速计数
from collections import Counter
values_count = Counter(data)
9.使用collections.ChainMap加速字典合并
dic_a = {i:i+1 for i in range(1,1000,2)}
dic_b = {i:2*i+1 for i in range(1,1000,3)}
result = dic_a.copy()
result.update(dic_b)
#低速方法
from collections import ChainMap
chain = ChainMap(dic_a,dic_b)
使用高阶函数进行加速
10.使用map代替推导式进行加速
result = [x*2 for x in range(1, 1000)]
#低速方法
result = map(lambda x : x**2, range(1, 1000))
#高速方法
11.使用filter代替推导式进行加速
result = [x for x in range(1, 1000) if x % 7 == 0]
# 低速方法
result = filter(lambda x : x%7==0, range(1, 1000))
网友评论