如何让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实现从订阅源下载图片的方法
Mar 11 Python
Python实现求最大公约数及判断素数的方法
May 26 Python
python实现在windows服务中新建进程的方法
Jun 30 Python
Python通过90行代码搭建一个音乐搜索工具
Jul 29 Python
快速排序的算法思想及Python版快速排序的实现示例
Jul 02 Python
Python 两个列表的差集、并集和交集实现代码
Sep 21 Python
python实现发送邮件功能
Jul 22 Python
python中模块查找的原理与方法详解
Aug 11 Python
python 对字典按照value进行排序的方法
May 09 Python
JAVA SWT事件四种写法实例解析
Jun 05 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
Nov 24 Python
Selenium环境变量配置(火狐浏览器)及验证实现
Dec 07 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
第八节 访问方式 [8]
2006/10/09 PHP
php分页代码学习示例分享
2014/02/20 PHP
php实现源代码加密的方法
2015/07/11 PHP
php实现遍历多维数组的方法
2015/11/25 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
2010/12/02 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
jQuery中阻止冒泡事件的方法介绍
2014/04/12 Javascript
让IE8浏览器支持function.bind()方法
2014/10/16 Javascript
JavaScript插件化开发教程 (一)
2015/01/27 Javascript
浅谈JavaScript中的Math.atan()方法的使用
2015/06/14 Javascript
使用JQuery实现智能表单验证功能
2016/03/08 Javascript
Vue插件写、用详解(附demo)
2017/03/20 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
详解nodejs的express如何自动生成项目框架
2017/07/12 NodeJs
浅谈Vue父子组件和非父子组件传值问题
2017/08/22 Javascript
利用原生JavaScript实现造日历轮子实例代码
2019/05/08 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
2019/11/20 Javascript
jQuery操作动画完整实例分析
2020/01/10 jQuery
在vue中使用Echarts画曲线图的示例
2020/10/03 Javascript
[03:55]DOTA2完美大师赛选手传记——LFY.MONET
2017/11/18 DOTA
python对字典进行排序实例
2014/09/25 Python
python BeautifulSoup设置页面编码的方法
2015/04/03 Python
python各种语言间时间的转化实现代码
2016/03/23 Python
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
使用python生成目录树
2018/03/29 Python
Anaconda下安装mysql-python的包实例
2018/06/11 Python
python爬虫框架scrapy实现模拟登录操作示例
2018/08/02 Python
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
工地质量标语
2014/06/12 职场文书
社会学专业求职信
2014/07/17 职场文书
一份恶作剧的检讨书
2014/09/13 职场文书
汽车销售助理岗位职责
2015/04/14 职场文书
实习介绍信范文
2015/05/05 职场文书
强烈推荐:小学生:暑假作息时间表(值得收藏)
2019/07/09 职场文书
python文件名批量重命名脚本实例代码
2021/04/22 Python