如何让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使用urllib2获取网络资源实例讲解
Dec 02 Python
将Emacs打造成强大的Python代码编辑工具
Nov 20 Python
Python3实现发送QQ邮件功能(文本)
Dec 15 Python
Python爬虫框架Scrapy实例代码
Mar 04 Python
Python使用cx_Freeze库生成msi格式安装文件的方法
Jul 10 Python
python list转矩阵的实例讲解
Aug 04 Python
Python列表切片操作实例总结
Feb 19 Python
python 多线程对post请求服务器测试并发的方法
Jun 13 Python
python如何以表格形式打印输出的方法示例
Jun 21 Python
用python写一个定时提醒程序的实现代码
Jul 22 Python
Python3 sys.argv[ ]用法详解
Oct 24 Python
详解Pandas 处理缺失值指令大全
Jul 30 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之对抗Web扫描器的脚本技巧
2008/10/01 PHP
php中存储用户ID和密码到mysql数据库的方法
2013/02/06 PHP
Zend Guard使用指南及问题处理
2015/01/07 PHP
详解PHP实现支付宝小程序用户授权的工具类
2018/12/25 PHP
Jquery中显示隐藏的实现代码分析
2011/07/26 Javascript
浅谈JavaScript之事件绑定
2013/07/08 Javascript
js实时监控文本框输入字数的实例代码
2018/01/18 Javascript
express + jwt + postMan验证实现持久化登录
2019/06/05 Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
2019/06/21 Javascript
打开电脑上的QQ的python代码
2013/02/10 Python
python实现的守护进程(Daemon)用法实例
2015/06/02 Python
Python编写电话薄实现增删改查功能
2016/05/07 Python
完美解决python遍历删除字典里值为空的元素报错问题
2016/09/11 Python
使用Flask集成bootstrap的方法
2018/07/24 Python
Python随机函数库random的使用方法详解
2019/08/21 Python
python爬虫模拟浏览器的两种方法实例分析
2019/12/09 Python
Python计算机视觉里的IOU计算实例
2020/01/17 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
基于PyTorch中view的用法说明
2021/03/03 Python
Hotels.com南非:酒店预订
2017/11/02 全球购物
Rakuten Kobo台湾:电子书、eReaders和Reading应用程式
2017/11/24 全球购物
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
攀岩、滑雪、徒步旅行装备:Black Diamond Equipment
2019/08/16 全球购物
世界上最受欢迎的花店:1-800-Flowers.com
2020/06/01 全球购物
判断单链表中是否存在环
2012/07/16 面试题
司机岗位职责
2013/11/15 职场文书
《我的伯父鲁迅先生》教学反思
2014/02/12 职场文书
青年安全生产示范岗事迹材料
2014/05/04 职场文书
军训拉歌口号
2014/06/13 职场文书
中职招生先进个人材料
2014/08/31 职场文书
医院领导班子四风问题对照检查材料
2014/10/26 职场文书
领导干部考核评语
2015/01/04 职场文书
2015年治庸问责工作总结
2015/07/27 职场文书
放假通知怎么写
2015/08/18 职场文书
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python
python turtle绘图命令及案例
2021/11/23 Python