zoukankan      html  css  js  c++  java
  • 提高python运行速度的几个技巧


    使用内置数据类型

    内置数据类型非常快,尤其是与我们自定义的类型相比。

    这主要是因为内置的数据类型是由 C 实现的,而在 Python 中写的代码运行速度实在无法与之相比。

    尽量使用内置函数,去掉属性访问

    import math
    import time
    
    def func():
        lst = []
        for i in range(1, 10000000):
            lst.append(math.sqrt(i)) # 直接调用 sqrt
        return lst
    
    start = time.time()
    lst = func()
    end = time.time()
    print(end-start)

    运行时间:4.470336198806763秒

    from math import sqrt # 直接引用特定函数或属性
    import time
    
    def func():
    lst = []
    for i in range(1, 10000000):
    lst.append(sqrt(i)) # 直接调用 sqrt
    return lst
    
    start = time.time()
    lst = func()
    end = time.time()
    print(end-start)

    运行时间:3.7398300170898438秒

    因为在进行属性访问的时候啊,会调用这个对象的 __getattribute__ 或者 __getattr__ 方法,造成了额外的开销,所以导致速度变慢。

    使用生成器,例如列表推导式

    from math import sqrt
    import time
    
    def func():
    # for 循环改为列表推导式
    lst = [sqrt(i) for i in range(1, 10000000)]
    return lst
    
    start = time.time()
    lst = func()
    end = time.time()
    print(end-start)

    列表推导式内的迭代是 C 实现的,所以效率更高。

    使用 lru_cache 缓存或持久化

    参考:https://www.cnblogs.com/-wenli/p/11441142.html

    尽量使用本地变量

    程序运行速度与在每个作用域中查找变量有关。
    实际上,访问不同作用域的变量速度也是不同的,比如在函数内访问本地变量(最快),访问类层面变量(如 self.name,比较慢),以及全局变量,比如例子中导入的函数 time.time (这种最慢)。


    使用numba

    介绍

    Numba是Python的即时编译器,它最适用于使用NumPy数组和函数以及循环的代码。使用Numba的最常用方法是通过其装饰器集合,可以应用于您的函数来指示Numba编译它们。当调用Numba修饰函数时,它被编译为机器代码“及时”执行,并且您的全部或部分代码随后可以以本机机器代码速度运行!

    什么样的代码会被加速?
    代码中的数学运算、NumPy或者循环,兼容常用的科学计算包,如numpy、cmath等。

    怎么使用?
    只需要添加两行代码

    导入及使用语法糖

    import numba as nb
    import numpy as np
    import time
    
    @nb.jit(nopython=True)
    def nb_sum():
      arr = []
      for i in range(10000000):
        arr.append(i)
    
    
    def py_sum():
      arr = []
      for i in range(10000000):
        arr.append(i)
    
    
    start = time.time()
    nb_sum()
    end = time.time()
    print("numba加速的函数运行时间: %s" % (end - start))
    
    
    start = time.time()
    py_sum()
    end = time.time()
    print("没加速的函数运行时间: %s" % (end - start))

    工作原理
    Numba读取装饰函数的Python字节码,并将其与有关函数输入参数类型的信息相结合。
    它分析并优化您的代码,最后使用LLVM编译器库生成函数的机器代码版本,根据您的CPU功能量身定制。
    每次调用函数时都会使用此编译版本。

  • 相关阅读:
    第8月第15天 app支持后台播放
    第8月第12天 python json.dumps danmu
    第7月第27天 c++11 boost
    第7月第26天 iOS httpserver
    第7月第25天 xcode bundle calayer动画
    我曾七次鄙视自己的灵魂
    learning shell display alert function(5)
    learning armbian steps(6) ----- armbian 源码分析(一)
    learning scala 数组和容器
    learning scala ide tools install
  • 原文地址:https://www.cnblogs.com/-wenli/p/12283601.html
Copyright © 2011-2022 走看看