如何让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用Pygal如何生成漂亮的SVG图像详解
Feb 10 Python
Python学生成绩管理系统简洁版
Apr 05 Python
python中reader的next用法
Jul 24 Python
python使用suds调用webservice接口的方法
Jan 03 Python
在python中利用opencv简单做图片比对的方法
Jan 24 Python
Django models.py应用实现过程详解
Jul 29 Python
python单向循环链表原理与实现方法示例
Dec 03 Python
Python动态声明变量赋值代码实例
Dec 30 Python
tensorflow 自定义损失函数示例代码
Feb 05 Python
Python爬虫进阶之爬取某视频并下载的实现
Dec 08 Python
Python实现日志实时监测的示例详解
Apr 06 Python
python数字图像处理之图像的批量处理
Jun 28 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
thinkphp模板用法和内容输出实例
2014/11/28 PHP
php获取json数据所有的节点路径
2015/05/17 PHP
php获取当前url地址的方法小结
2017/01/10 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
2009/05/25 Javascript
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
在Javascript里访问SharePoint列表数据的实现方法
2011/05/22 Javascript
原生JS实现加入收藏夹的代码
2013/10/24 Javascript
jQuery中get()方法用法实例
2014/12/27 Javascript
javascript制作sql转换为stringBuffer的小工具
2015/04/03 Javascript
javascript中eval函数用法分析
2015/04/25 Javascript
js操作css属性实现div层展开关闭效果的方法
2015/05/11 Javascript
Backbone.js框架中简单的View视图编写学习笔记
2016/02/14 Javascript
nodeJs爬虫获取数据简单实现代码
2016/03/29 NodeJs
微信小程序 教程之事件
2016/10/18 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
jquery实现放大镜简洁代码(推荐)
2017/06/08 jQuery
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
Python cx_freeze打包工具处理问题思路及解决办法
2016/02/13 Python
Python模拟登陆实现代码
2017/06/14 Python
python3.6+django2.0开发一套学员管理系统
2018/03/03 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
Python中使用遍历在列表中添加字典遇到的坑
2019/02/27 Python
pytorch中的transforms模块实例详解
2019/12/31 Python
keras CNN卷积核可视化,热度图教程
2020/06/22 Python
简单html5代码获取地理位置
2014/03/31 HTML / CSS
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
建筑专业自我鉴定
2013/10/22 职场文书
环卫工作个人总结
2015/03/04 职场文书
python 逐步回归算法
2021/04/06 Python
压缩Redis里的字符串大对象操作
2021/06/23 Redis
python开发的自动化运维工具ansible详解
2021/08/07 Python
Java数据结构之堆(优先队列)
2022/05/20 Java/Android
postgresql中如何执行sql文件
2023/05/08 PostgreSQL