如何让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实现基本线性数据结构
Aug 22 Python
Python爬虫番外篇之Cookie和Session详解
Dec 27 Python
使用Python爬取最好大学网大学排名
Feb 24 Python
python实现自动登录后台管理系统
Oct 18 Python
Python3实现取图片中特定的像素替换指定的颜色示例
Jan 24 Python
Python变量类型知识点总结
Feb 18 Python
Pandas读写CSV文件的方法示例
Mar 27 Python
对django的User模型和四种扩展/重写方法小结
Aug 17 Python
Python基础之变量基本用法与进阶详解
Jan 03 Python
在Python IDLE 下调用anaconda中的库教程
Mar 09 Python
Keras Convolution1D与Convolution2D区别说明
May 22 Python
基于Python实现下载网易音乐代码实例
Aug 10 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分页显示制作详细讲解
2006/10/09 PHP
PHP取整数函数常用的四种方法小结
2012/07/05 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
2014/12/01 PHP
PHP连接access数据库
2015/03/27 PHP
php查找字符串中第一个非0的位置截取
2017/02/27 PHP
Jquery上传插件 uploadify v3.1使用说明
2012/06/18 Javascript
javascript学习笔记(十二) RegExp类型介绍
2012/06/20 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
JavaScript蒙板(model)功能的简单实现代码
2016/08/04 Javascript
React Native中的RefreshContorl下拉刷新使用
2017/10/09 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
2019/01/18 Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
2019/08/08 Javascript
js实现蒙版效果
2020/01/11 Javascript
JS 数组基本用法入门示例解析
2020/01/16 Javascript
Vue 组件的挂载与父子组件的传值实例
2020/09/02 Javascript
python网络编程示例(客户端与服务端)
2014/04/24 Python
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
Python for Informatics 第11章 正则表达式(一)
2016/04/21 Python
使用Python读取大文件的方法
2018/02/11 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
python程序 创建多线程过程详解
2019/09/23 Python
学Python 3的理由和必要性
2019/11/19 Python
django 数据库 get_or_create函数返回值是tuple的问题
2020/05/15 Python
python中加背景音乐如何操作
2020/07/19 Python
matplotlib subplot绘制多个子图的方法示例
2020/07/28 Python
美国零售商店:Blue&Cream
2017/04/07 全球购物
BIBLOO波兰:捷克的一家在线服装店
2018/03/09 全球购物
美国糖果店:Sugarfina
2019/02/21 全球购物
Theflamel意大利:女士奢华服装、鞋子和配件
2020/01/11 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
德国最大的婴儿用品网上商店:Kidsroom.de(支持中文)
2020/09/02 全球购物
优乐美广告词
2014/03/14 职场文书
放弃遗产继承公证书
2015/01/26 职场文书
储备店长岗位职责
2015/04/14 职场文书
导游词之云南-元阳梯田
2019/10/08 职场文书
Golang中异常处理机制详解
2021/06/08 Golang