如何让python的运行速度得到提升


Posted in Python onJuly 08, 2020

python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差。

“一行代码让python的运行速度提高100倍”这绝不是哗众取宠的论调。

我们来看一下这个最简单的例子,从1一直累加到1亿。

最原始的代码:

import time
def foo(x,y):
  tt = time.time()
  s = 0
  for i in range(x,y):
    s += i
  print('Time used: {} sec'.format(time.time()-tt))
  return s
print(foo(1,100000000))

结果

Time used: 6.779874801635742 sec
4999999950000000

是不是快了100多倍呢?

那么下面就分享一下“为啥numba库的jit模块那么牛掰?”

NumPy的创始人Travis Oliphant在离开Enthought之后,创建了CONTINUUM,致力于将Python大数据处理方面的应用。最近推出的Numba项目能够将处理NumPy数组的Python函数JIT编译为机器码执行,从而上百倍的提高程序的运算速度。

Numba项目的主页上有Linux下的详细安装步骤。编译LLVM需要花一些时间。

Windows用户可以从Unofficial Windows Binaries for Python Extension Packages下载安装LLVMPy、meta和numba等几个扩展库。

下面我们看一个例子:

import numba as nb
from numba import jit
@jit('f8(f8[:])')
def sum1d(array):
 s = 0.0
 n = array.shape[0]
 for i in range(n):
  s += array[i]
 return s
import numpy as np
array = np.random.random(10000)
%timeit sum1d(array)
%timeit np.sum(array)
%timeit sum(array)
10000 loops, best of 3: 38.9 us per loop
10000 loops, best of 3: 32.3 us per loop
100 loops, best of 3: 12.4 ms per loop

numba中提供了一些修饰器,它们可以将其修饰的函数JIT编译成机器码函数,并返回一个可在Python中调用机器码的包装对象。为了能将Python函数编译成能高速执行的机器码,我们需要告诉JIT编译器函数的各个参数和返回值的类型。我们可以通过多种方式指定类型信息,在上面的例子中,类型信息由一个字符串'f8(f8[:])'指定。其中'f8'表示8个字节双精度浮点数,括号前面的'f8'表示返回值类型,括号里的表示参数类型,'[:]'表示一维数组。因此整个类型字符串表示sum1d()是一个参数为双精度浮点数的一维数组,返回值是一个双精度浮点数。

内容扩展:

Python运行速度提升

相比较C,C++,python一直被抱怨运行速度很慢,实际上python的执行效率并不慢,而是解释器Cpython运行效率很差。

通过使用numba库的jit可以让python的运行速度提高百倍以上。

同诺简单累加,相乘的例子,可以看出。

#!/usr/bin/env python
# encoding: utf-8
'''
@author: Victor
@Company:华中科技大学电气学院聚变与等离子研究所
@version: V1.0
@contact: 1650996069@qq.com 2018--2020
@software: PyCharm2018
@file: quickPython3.py
@time: 2018/9/21 20:54
@desc:使用numba的jit是python代码运行速度提高100倍左右
'''
'''平常运行'''
import time
def add(x,y):
    tt = time.time()
    s = 0
    for i in range(x,y):
        s += i
    print('The time used: {} seconds'.format(time.time()-tt))
    return s
 
add(1,100000000)
##########结果###############
# D:\Python3\python.exe D:/Pycharm2018Works/InsteringPython3/SomeBasics/quickPython3.py
# The time used: 6.712835788726807 seconds
# Process finished with exit code 0
'''调用numba运行'''
import time
from numba import jit
@jit
def add(x,y):
    tt = time.time()
    s = 0
    for i in range(x,y):
        s += i
    print('The time used: {} seconds'.format(time.time()-tt))
    return s
 
add(1,100000000)
##########结果###############
# D:\Python3\python.exe D:/Pycharm2018Works/InsteringPython3/SomeBasics/quickPython3.py
# The time used: 0.06396007537841797 seconds
# 
# Process finished with exit code 0

Numba模块能够将处理NumPy数组的Python函数JIT编译为机器码执行,从而上百倍的提高程序的运算速度。

Python 相关文章推荐
Python中exit、return、sys.exit()等使用实例和区别
May 28 Python
Python中pygame的mouse鼠标事件用法实例
Nov 11 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
Oct 13 Python
Python实现桶排序与快速排序算法结合应用示例
Nov 22 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
May 04 Python
对pandas的行列名更改与数据选择详解
Nov 12 Python
python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
Apr 01 Python
浅析PEP572: 海象运算符
Oct 15 Python
基于Pyinstaller打包Python程序并压缩文件大小
May 28 Python
Pycharm及python安装详细教程(图解)
Jul 31 Python
详解pycharm自动import所需的库的操作方法
Nov 30 Python
python如何修改文件时间属性
Feb 05 Python
opencv 图像加法与图像融合的实现代码
Jul 08 #Python
opencv 图像轮廓的实现示例
Jul 08 #Python
opencv 图像滤波(均值,方框,高斯,中值)
Jul 08 #Python
用opencv给图片换背景色的示例代码
Jul 08 #Python
python文件及目录操作代码汇总
Jul 08 #Python
Python预测2020高考分数和录取情况
Jul 08 #Python
Python venv虚拟环境配置过程解析
Jul 08 #Python
You might like
PHP新手上路(十三)
2006/10/09 PHP
一个php生成16位随机数的代码(两种方法)
2014/09/16 PHP
php定义参数数量可变的函数用法实例
2015/03/16 PHP
PHP实现文件上传和多文件上传
2015/12/24 PHP
jquery链式操作的正确使用方法
2014/01/06 Javascript
addEventListener 的用法示例介绍
2014/05/07 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
JavaScript事件学习小结(五)js中事件类型之鼠标事件
2016/06/09 Javascript
react.js 翻页插件实例代码
2017/01/19 Javascript
网页中右键功能的实现方法之contextMenu的使用
2017/02/20 Javascript
JS加密插件CryptoJS实现的Base64加密示例
2020/08/16 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
Vue分页效果与购物车功能
2019/12/13 Javascript
JavaScript如何判断对象有某属性
2020/07/03 Javascript
vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作
2020/07/31 Javascript
[01:06:30]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第二场 1月9日
2021/03/11 DOTA
[01:20:47]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第一场 1月19日
2021/03/11 DOTA
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
2017/06/20 Python
Python判断文件和字符串编码类型的实例
2017/12/21 Python
python3 读取Excel表格中的数据
2018/10/16 Python
对Python 除法负数取商的取整方式详解
2018/12/12 Python
用Python识别人脸,人种等各种信息
2019/07/15 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
python构造函数init实例方法解析
2020/01/19 Python
利用python对excel中一列的时间数据更改格式操作
2020/07/14 Python
Python不支持 i ++ 语法的原因解析
2020/07/22 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
环保标语口号
2014/06/13 职场文书
国际金融专业自荐信
2014/07/05 职场文书
毕业生实习期转正自我鉴定
2014/09/26 职场文书
党的群众路线教育实践活动个人剖析材料
2014/10/07 职场文书
瘦西湖导游词
2015/02/03 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书
mysql 数据插入优化方法之concurrent_insert
2021/07/01 MySQL
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android