如何让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和php通信乱码问题解决方法
Apr 15 Python
pandas中去除指定字符的实例
May 18 Python
浅谈tensorflow中几个随机函数的用法
Jul 27 Python
Python多线程应用于自动化测试操作示例
Dec 06 Python
Python3内置模块random随机方法小结
Jul 13 Python
树莓派极简安装OpenCv的方法步骤
Oct 10 Python
python Pillow图像处理方法汇总
Oct 16 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
Mar 09 Python
Python restful框架接口开发实现
Apr 13 Python
教你怎么用Python实现多路径迷宫
Apr 29 Python
用python删除文件夹中的重复图片(图片去重)
May 12 Python
python munch库的使用解析
May 25 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 Cookie的一个使用注意点
2008/11/08 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
2011/08/23 PHP
php采集文章中的图片获取替换到本地(实现代码)
2013/07/08 PHP
php递归方法实现无限分类实例代码
2014/02/28 PHP
Zend Framework教程之Application用法实例详解
2016/03/14 PHP
CI框架整合widget(页面格局)的方法
2016/05/17 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
简单JS代码压缩器
2006/10/12 Javascript
JQuery操作单选按钮以及复选按钮示例
2013/09/23 Javascript
Javasipt:操作radio标签详解
2013/12/30 Javascript
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
只要1K 纯JS脚本送你一朵3D红色玫瑰
2016/08/09 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
深入理解vue.js中的v-if和v-show
2017/06/22 Javascript
在Vue组件中使用 TypeScript的方法
2018/02/28 Javascript
在Vue中获取组件声明时的name属性方法
2018/09/12 Javascript
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
微信小程序在其他页面监听globalData中值的变化
2019/07/15 Javascript
[45:50]完美世界DOTA2联赛PWL S3 CPG vs Forest 第二场 12.16
2020/12/17 DOTA
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
Python中exit、return、sys.exit()等使用实例和区别
2015/05/28 Python
python避免死锁方法实例分析
2015/06/04 Python
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
2018/09/03 Python
Python3实现打印任意宽度的菱形代码
2020/04/12 Python
django 模版关闭转义方式
2020/05/14 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
2020/06/23 Python
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
英国一家专门出售品牌鞋子的网站:Allsole
2016/08/07 全球购物
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
诚信考试承诺书
2014/03/27 职场文书
村委会换届选举方案
2014/05/03 职场文书
幼儿园教师节感谢信
2015/01/23 职场文书
个人年底工作总结
2015/03/10 职场文书
党员个人承诺书
2015/04/27 职场文书