如何让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和bash统计CPU利用率的方法
Jul 10 Python
Python生成器的使用方法和示例代码
Mar 04 Python
python如何制作缩略图
Apr 30 Python
Python中常用的8种字符串操作方法
May 06 Python
Python Django的安装配置教程图文详解
Jul 17 Python
django框架使用方法详解
Jul 18 Python
python爬虫解决验证码的思路及示例
Aug 01 Python
Python利用全连接神经网络求解MNIST问题详解
Jan 14 Python
Python2与Python3的区别详解
Feb 09 Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
Feb 29 Python
解决Django Haystack全文检索为空的问题
May 19 Python
Python requests上传文件实现步骤
Sep 15 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/04/22 星际争霸
深入php var_dump()函数的详解
2013/06/05 PHP
php实现批量压缩图片文件大小的脚本
2014/07/04 PHP
javascript+php实现根据用户时区显示当地时间的方法
2015/03/11 PHP
yii的入口文件index.php中为什么会有这两句
2016/08/04 PHP
javascript下对于事件、事件流、事件触发的顺序随便说说
2010/07/17 Javascript
Array 重排序方法和操作方法的简单实例
2014/01/24 Javascript
jQuery截取指定长度字符串代码
2014/08/21 Javascript
jQuery添加和删除输入文本框标签代码
2016/05/20 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
js操作浏览器的参数方法
2017/01/21 Javascript
angular或者js怎么确定选中ul中的哪几个li
2017/08/16 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
2018/01/02 jQuery
js中Generator函数的深入讲解
2019/04/07 Javascript
js form表单input框限制20个字符,10个汉字代码实例
2019/04/12 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
linux系统使用python监测网络接口获取网络的输入输出
2014/01/15 Python
Python写的一个简单监控系统
2015/06/19 Python
在Python中实现shuffle给列表洗牌
2018/11/08 Python
用python标准库difflib比较两份文件的异同详解
2018/11/16 Python
python3 实现对图片进行局部切割的方法
2018/12/05 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
一行python实现树形结构的方法
2019/08/09 Python
python @classmethod 的使用场合详解
2019/08/23 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
Pytorch之Tensor和Numpy之间的转换的实现方法
2020/09/03 Python
css3中的calc函数浅析
2018/07/10 HTML / CSS
高性能装备提升营地:Kammok
2019/02/27 全球购物
创意活动策划书
2014/01/15 职场文书
公务员培训自我鉴定
2014/02/01 职场文书
建筑专业毕业生自荐信
2014/05/25 职场文书
捐书倡议书
2014/08/29 职场文书
刑事附带民事起诉状
2015/05/19 职场文书
springboot中一些比较常用的注解总结
2021/06/11 Java/Android