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功能量身定制。
    每次调用函数时都会使用此编译版本。

  • 相关阅读:
    【2018.05.05 C与C++基础】C++中的自动废料收集:概念与问题引入
    【2018.04.27 C与C++基础】关于switch-case及if-else的效率问题
    【2018.04.19 ROS机器人操作系统】机器人控制:运动规划、路径规划及轨迹规划简介之一
    March 11th, 2018 Week 11th Sunday
    March 10th, 2018 Week 10th Saturday
    March 09th, 2018 Week 10th Friday
    March 08th, 2018 Week 10th Thursday
    March 07th, 2018 Week 10th Wednesday
    ubantu之Git使用
    AMS分析 -- 启动过程
  • 原文地址:https://www.cnblogs.com/-wenli/p/12283601.html
Copyright © 2011-2022 走看看