美文网首页
加速python程序

加速python程序

作者: 葡萄柚子茶 | 来源:发表于2019-06-11 16:25 被阅读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))
    

    相关文章

      网友评论

          本文标题:加速python程序

          本文链接:https://www.haomeiwen.com/subject/czyqfctx.html