加速python程序

2019-06-11  本文已影响0人  葡萄柚子茶

加速查找

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))
上一篇下一篇

猜你喜欢

热点阅读