如何让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 相关文章推荐
基于asyncio 异步协程框架实现收集B站直播弹幕
Sep 11 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
Apr 28 Python
Python基于Tkinter模块实现的弹球小游戏
Dec 27 Python
详解python中@的用法
Mar 27 Python
Django 后台获取文件列表 InMemoryUploadedFile的例子
Aug 07 Python
python实现淘宝购物系统
Oct 25 Python
Python3实现配置文件差异对比脚本
Nov 18 Python
简单了解python filter、map、reduce的区别
Jan 14 Python
Python生成器传参数及返回值原理解析
Jul 22 Python
python根据字典的键来删除元素的方法
Aug 16 Python
Python 发送SMTP邮件的简单教程
Jun 24 Python
FP-growth算法发现频繁项集——构建FP树
Jun 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
php学习之 认清变量的作用范围
2010/01/26 PHP
解析百度搜索结果link?url=参数分析 (全)
2012/10/09 PHP
php实现文件下载更能介绍
2012/11/23 PHP
php class类的用法详细总结
2013/10/17 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
2014/08/23 PHP
CodeIgniter配置之SESSION用法实例分析
2016/01/19 PHP
PHP自带方法验证邮箱、URL、IP是否合法的函数
2016/12/08 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
CSS(js)限制页面显示的文本字符长度
2012/12/27 Javascript
JS实现文字向下滚动完整实例
2015/02/06 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
2015/09/05 Javascript
深入理解vue.js双向绑定的实现原理
2016/12/05 Javascript
基于jQuery封装的分页组件
2017/06/26 jQuery
js实现页面多个日期时间倒计时效果
2019/06/20 Javascript
JavaScript如何实现监听键盘输入和鼠标监点击
2020/07/20 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
python检查序列seq是否含有aset中项的方法
2015/06/30 Python
Python实现将DOC文档转换为PDF的方法
2015/07/25 Python
Python二叉树的镜像转换实现方法示例
2019/03/06 Python
使用PyQt4 设置TextEdit背景的方法
2019/06/14 Python
python应用文件读取与登录注册功能
2019/09/23 Python
Python实现线性插值和三次样条插值的示例代码
2019/11/13 Python
centos7中安装python3.6.4的教程
2019/12/11 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
2020/03/25 Python
python中数字是否为可变类型
2020/07/08 Python
澳大利亚香水在线:Price Rite Mart
2017/12/28 全球购物
瑞典廉价机票预订网站:Seat24
2018/06/19 全球购物
关于爱国的演讲稿
2014/05/07 职场文书
2014教师研修学习体会
2014/07/08 职场文书
绿色环保家庭事迹材料
2014/08/31 职场文书
党的群众路线教育实践活动个人对照检查材料(乡镇)
2014/11/05 职场文书
2014年网管工作总结
2014/12/11 职场文书
法定授权委托证明书
2015/06/18 职场文书
护理培训心得体会
2016/01/22 职场文书
Dubbo+zookeeper搭配分布式服务的过程详解
2022/04/03 Java/Android