如何让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使用chardet判断字符编码
May 09 Python
使用Python求解最大公约数的实现方法
Aug 20 Python
python中的字典使用分享
Jul 31 Python
Python爬取三国演义的实现方法
Sep 12 Python
利用python爬取软考试题之ip自动代理
Mar 28 Python
matplotlib subplots 设置总图的标题方法
May 25 Python
Python实现的各种常见分布算法示例
Dec 13 Python
如何用Python做一个微信机器人自动拉群
Jul 03 Python
python 实现二维列表转置
Dec 02 Python
python中关于数据类型的学习笔记
Jul 19 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
Jan 29 Python
python基础之模块的导入
Oct 24 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
玩家交还《星际争霸》原始码光盘 暴雪报以厚礼
2017/05/05 星际争霸
destoon之一键登录设置
2014/06/21 PHP
php分页函数完整实例代码
2014/09/22 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
2016/09/14 PHP
FireFox下XML对象转化成字符串的解决方法
2011/12/09 Javascript
jquery ui对话框实例代码
2013/05/10 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
JavaScript中数组的合并以及排序实现示例
2015/10/24 Javascript
JavaScript实战之菜单特效
2016/08/16 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
vue使用rem实现 移动端屏幕适配
2018/09/26 Javascript
利用Dectorator分模块存储Vuex状态的实现
2019/02/05 Javascript
Vue中fragment.js使用方法小结
2020/02/17 Javascript
详解Python的Django框架中的templates设置
2015/05/11 Python
Python中装饰器学习总结
2018/02/10 Python
使用Python对微信好友进行数据分析
2018/06/27 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
2019/08/13 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
python 利用百度API识别图片文字(多线程版)
2020/12/14 Python
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
2013/08/02 HTML / CSS
香港草莓网土耳其网站:Strawberrynet TR
2017/03/02 全球购物
将"引用"作为函数返回值类型的格式、好处和需要遵守的规则
2016/02/09 面试题
我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
2014/03/30 面试题
交通安全演讲稿
2014/01/07 职场文书
幼儿园中秋节活动方案2013
2014/01/29 职场文书
报关员个人职业生涯规划书
2014/03/12 职场文书
新疆民族团结演讲稿
2014/08/27 职场文书
2014年青年教师工作总结
2014/12/17 职场文书
校园音乐节目广播稿
2015/08/19 职场文书
《雪地里的小画家》教学反思
2016/02/16 职场文书
2016年学生会感恩节活动总结
2016/04/01 职场文书
MySQL通过binlog恢复数据
2021/05/27 MySQL
MySQL索引失效的典型案例
2021/06/05 MySQL
Oracle安装TNS_ADMIN环境变量设置参考
2021/11/01 Oracle