提高python运行速度的几个技巧

笑着哭i 提交于 2020-02-08 16:36:07


使用内置数据类型

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

这主要是因为内置的数据类型是由 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功能量身定制。
每次调用函数时都会使用此编译版本。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!