如何让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异常和文件处理机制详解
Jul 19 Python
python遍历序列enumerate函数浅析
Oct 17 Python
利用python编写一个图片主色转换的脚本
Dec 07 Python
使用NumPy和pandas对CSV文件进行写操作的实例
Jun 14 Python
对python 命令的-u参数详解
Dec 03 Python
一篇文章了解Python中常见的序列化操作
Jun 20 Python
python代码 FTP备份交换机配置脚本实例解析
Aug 01 Python
Python K最近邻从原理到实现的方法
Aug 15 Python
python读取excel进行遍历/xlrd模块操作
Jul 12 Python
Python extract及contains方法代码实例
Sep 11 Python
Python Web项目Cherrypy使用方法镜像
Nov 05 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
Feb 03 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连接与操作PostgreSQL数据库的方法
2014/12/25 PHP
PHP7之Mongodb API使用详解
2015/12/26 PHP
tbody元素支持嵌套的注意方法
2007/03/24 Javascript
收藏Javascript中常用的55个经典技巧
2007/08/12 Javascript
jQuery仿Excel表格编辑功能的实现代码
2013/05/01 Javascript
jquery将一个表单序列化为一个对象的方法
2013/12/02 Javascript
javascript实现iframe框架延时加载的方法
2014/10/30 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
详解vue-cli项目中怎么使用mock数据
2018/05/29 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
2019/04/17 Javascript
[10:14]2018DOTA2国际邀请赛寻真——paiN Gaming不仅为自己而战
2018/08/14 DOTA
[42:52]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
wxPython 入门教程
2008/10/07 Python
python获取list下标及其值的简单方法
2016/09/12 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
2016/12/14 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
python实现单链表中删除倒数第K个节点的方法
2018/09/28 Python
Python中实例化class的执行顺序示例详解
2018/10/14 Python
深入理解Django自定义信号(signals)
2018/10/15 Python
Python 从subprocess运行的子进程中实时获取输出的例子
2019/08/14 Python
利用python实现.dcm格式图像转为.jpg格式
2020/01/13 Python
房地产销售员的自我评价分享
2013/12/04 职场文书
中专生自我鉴定书范文
2013/12/28 职场文书
英文商务邀请信
2014/01/22 职场文书
2014新年元旦活动策划方案
2014/02/18 职场文书
环境建设实施方案
2014/03/14 职场文书
《画》教学反思
2014/04/14 职场文书
初中班主任评语大全
2014/04/24 职场文书
难忘的一天教学反思
2014/04/30 职场文书
大学生村官考核材料
2014/05/23 职场文书
师德师风的心得体会
2014/09/02 职场文书
法人委托书范本
2014/09/15 职场文书
优秀校长事迹材料
2014/12/24 职场文书
律政俏佳人观后感
2015/06/09 职场文书
骆驼祥子读书笔记
2015/06/26 职场文书