如何让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 相关文章推荐
Python3.x和Python2.x的区别介绍
Feb 12 Python
Python调用C语言开发的共享库方法实例
Mar 18 Python
玩转python爬虫之正则表达式
Feb 17 Python
Python+Selenium自动化实现分页(pagination)处理
Mar 31 Python
Python实现感知器模型、两层神经网络
Dec 19 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
Mar 15 Python
使用Django启动命令行及执行脚本的方法
May 29 Python
利用nohup来开启python文件的方法
Jan 14 Python
pandas 空数据处理方法详解
Nov 02 Python
常用python爬虫库介绍与简要说明
Jan 25 Python
Python fileinput模块如何逐行读取多个文件
Oct 05 Python
如何利用Python实现一个论文降重工具
Jul 09 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入门教程 精简版
2009/12/13 PHP
PHP 防恶意刷新实现代码
2010/05/16 PHP
php实现的DateDiff和DateAdd时间函数代码分享
2014/08/16 PHP
PHP获取一个字符串中间一部分字符的方法
2014/08/19 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
老司机传授Ubuntu下Apache+PHP+MySQL环境搭建攻略
2016/03/20 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
2017/07/27 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
PHP文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
初学js插入节点appendChild insertBefore使用方法
2011/07/04 Javascript
extjs 分页使用jsp传递数据示例
2014/07/29 Javascript
Javascript中this的用法详解
2014/09/22 Javascript
JavaScript函数内部属性和函数方法实例详解
2016/03/17 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
JavaScript实现窗口抖动效果
2016/10/19 Javascript
jQuery插件FusionWidgets实现的Cylinder图效果示例【附demo源码】
2017/03/23 jQuery
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
2017/09/14 Javascript
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
JavaScript 双向链表操作实例分析【创建、增加、查找、删除等】
2020/04/28 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
基于Vue全局组件与局部组件的区别说明
2020/08/11 Javascript
[01:00:53]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Secret
2018/03/30 DOTA
Python的Flask框架中实现简单的登录功能的教程
2015/04/20 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
python3 property装饰器实现原理与用法示例
2019/05/15 Python
python使用opencv实现马赛克效果示例
2019/09/28 Python
Canvas波浪花环的示例代码
2020/08/21 HTML / CSS
销售找工作求职信
2013/12/20 职场文书
应聘教师自荐信
2015/03/26 职场文书
学术会议通知范文
2015/04/15 职场文书
投资公司董事长岗位职责
2015/04/16 职场文书
pandas提升计算效率的一些方法汇总
2021/05/30 Python
Java详细解析==和equals的区别
2022/04/07 Java/Android