python技巧!可以将numpy加速700倍!

人工智能博士 人工智能博士     2022-12-08     185

关键词:

点上方人工智能算法与Python大数据获取更多干货

在右上方 ··· 设为星标 ★,第一时间获取资源

仅做学术分享,如有侵权,联系删除

转载于 :机器之心

就其自身来说,Numpy 的速度已经较 Python 有了很大的提升。当你发现 Python 代码运行较慢,尤其出现大量的 for-loops 循环时,通常可以将数据处理移入 Numpy 并实现其向量化最高速度处理。

但有一点,上述 Numpy 加速只是在 CPU 上实现的。由于消费级 CPU 通常只有 8 个核心或更少,所以并行处理数量以及可以实现的加速是有限的。

这就催生了新的加速工具——CuPy 库。

何为 CuPy?

CuPy 是一个借助 CUDA GPU 库在英伟达 GPU 上实现 Numpy 数组的库。基于 Numpy 数组的实现,GPU 自身具有的多个 CUDA 核心可以促成更好的并行加速。

CuPy 接口是 Numpy 的一个镜像,并且在大多情况下,它可以直接替换 Numpy 使用。只要用兼容的 CuPy 代码替换 Numpy 代码,用户就可以实现 GPU 加速。

CuPy 支持 Numpy 的大多数数组运算,包括索引、广播、数组数学以及各种矩阵变换。

如果遇到一些不支持的特殊情况,用户也可以编写自定义 Python 代码,这些代码会利用到 CUDA 和 GPU 加速。整个过程只需要 C++格式的一小段代码,然后 CuPy 就可以自动进行 GPU 转换,这与使用 Cython 非常相似。

在开始使用 CuPy 之前,用户可以通过 pip 安装 CuPy 库:

pip install cupy

使用 CuPy 在 GPU 上运行

为符合相应基准测试,PC 配置如下:

  • i7–8700k CPU

  • 1080 Ti GPU

  • 32 GB of DDR4 3000MHz RAM

  • CUDA 9.0

CuPy 安装之后,用户可以像导入 Numpy 一样导入 CuPy:

import numpy as np
import cupy as cp
import time

在接下来的编码中,Numpy 和 CuPy 之间的切换就像用 CuPy 的 cp 替换 Numpy 的 np 一样简单。如下代码为 Numpy 和 CuPy 创建了一个具有 10 亿 1』s 的 3D 数组。为了测量创建数组的速度,用户可以使用 Python 的原生 time 库:

### Numpy and CPU
s = time.time()
*x_cpu = np.ones((1000,1000,1000))*
e = time.time()
print(e - s)### CuPy and GPU
s = time.time()
*x_gpu = cp.ones((1000,1000,1000))*
e = time.time()
print(e - s)

这很简单!

令人难以置信的是,即使以上只是创建了一个数组,CuPy 的速度依然快得多。Numpy 创建一个具有 10 亿 1』s 的数组用了 1.68 秒,而 CuPy 仅用了 0.16 秒,实现了 10.5 倍的加速。

但 CuPy 能做到的还不止于此。

比如在数组中做一些数学运算。这次将整个数组乘以 5,并再次检查 Numpy 和 CuPy 的速度。

### Numpy and CPU
s = time.time()
*x_cpu *= 5*
e = time.time()
print(e - s)### CuPy and GPU
s = time.time()
*x_gpu *= 5*
e = time.time()
print(e - s)

果不其然,CuPy 再次胜过 Numpy。Numpy 用了 0.507 秒,而 CuPy 仅用了 0.000710 秒,速度整整提升了 714.1 倍。

现在尝试使用更多数组并执行以下三种运算:

  1. 数组乘以 5

  2. 数组本身相乘

  3. 数组添加到其自身

### Numpy and CPU
s = time.time()
*x_cpu *= 5
x_cpu *= x_cpu
x_cpu += x_cpu*
e = time.time()
print(e - s)### CuPy and GPU
s = time.time()
*x_gpu *= 5
x_gpu *= x_gpu
x_gpu += x_gpu*
e = time.time()
print(e - s)

结果显示,Numpy 在 CPU 上执行整个运算过程用了 1.49 秒,而 CuPy 在 GPU 上仅用了 0.0922 秒,速度提升了 16.16 倍。

数组大小(数据点)达到 1000 万,运算速度大幅度提升

使用 CuPy 能够在 GPU 上实现 Numpy 和矩阵运算的多倍加速。值得注意的是,用户所能实现的加速高度依赖于自身正在处理的数组大小。下表显示了不同数组大小(数据点)的加速差异:

数据点一旦达到 1000 万,速度将会猛然提升;超过 1 亿,速度提升极为明显。Numpy 在数据点低于 1000 万时实际运行更快。此外,GPU 内存越大,处理的数据也就更多。所以用户应当注意,GPU 内存是否足以应对 CuPy 所需要处理的数据。

原文链接:https://towardsdatascience.com/heres-how-to-use-cupy-to-make-numpy-700x-faster-4b920dda1f56

---------♥---------

声明:本内容来源网络,版权属于原作者

图片来源网络,不代表本公众号立场。如有侵权,联系删除

AI博士私人微信,还有少量空位

如何画出漂亮的深度学习模型图?

如何画出漂亮的神经网络图?

一文读懂深度学习中的各种卷积

点个在看支持一下吧

将 Python 加速器(Cython、Numba、f2py)与 Numpy einsum 进行比较

】将Python加速器(Cython、Numba、f2py)与Numpyeinsum进行比较【英文标题】:ComparingPythonaccelerators(Cython,Numba,f2py)toNumpyeinsum【发布时间】:2016-05-0713:09:55【问题描述】:我将Python加速器(Numba、Cython、f2py)与针对特定问题的简单For循... 查看详情

python实战应用讲解-numpy专题篇实用小技巧(附python示例代码)

目录 在Python中返回数组的最大值或忽略任何NaN的最大值NumPy.nanmax()方法示例1:示例2:示例3:返回Python中用scimath将输入值提高到的幂的结果NumPy.lib.scimath.power方法示例1:示例2: 查看详情

python实战应用讲解-numpy专题篇实用小技巧(附python示例代码)

目录在Python中检查数值是否为无穷大或NaN检查数值是否为NaN检查该值是否是无穷大在Python中使用NumPy计算一组数据的柱状图用NumPy模块对bin进行nums计算的直方图用Python将协方差矩阵转换为相关矩阵协方差相关性相关和协方差之间... 查看详情

强化学习技巧五:numba提速python程序(代码片段)

numba是一款可以将python函数编译为机器代码的JIT编译器,经过numba编译的python代码(仅限数组运算),其运行速度可以接近C或FORTRAN语言。numba使用情况使用numpy数组做大量科学计算时使用for循环时1.numba使用导入numpy... 查看详情

[python]numpy中容易忽略的小技巧(代码片段)

对array沿某个维度进行复制np.tile(array,(times,1))#times是复制的次数当需要把一个(n,)的向量转为形状是(n,1)或者(1,n)的array,除了用np.reshape,还可以:array[:,np.newaxis] 查看详情

用python做策略回测,耗时很长,有啥加速办法

参考技术A用Python做策略回测,耗时很长,有什么加速办法少用for,尽量用numpy/pandas的向量化方法。少用自己写的python方法,先看看numpy/pandas是不是已有现成的功能。有几个numpy的加速包,比如numexpr.安装IntelMKL.最后,可以讲关键... 查看详情

python加速运行技巧

Python加速运行技巧,有时候,一些小技巧确实能够大大的提高效率推荐学习链接:https://zhuanlan.zhihu.com/p/143052860 查看详情

numpy之数据保存与读取(代码片段)

...的变量,fmt为保存格式,delimiter为分隔符。??我们的示例Python代码如下:#-*-coding:utf-8-* 查看详情

12种numpy&pandas高效技巧

...umpy的6种高效函数首先从Numpy开始。Numpy是用于科学计算的Python语言扩展包,通常包含强大的N维数组对象、复杂函数、用于整合C/C++和Fortran代码的工具以及有用的线性代数、傅里叶变换和随机数生成能力。除了上面这些... 查看详情

8个可以让python加速的tips(代码片段)

Python是一种脚本语言,相比C/C++这样的编译语言,在效率和性能方面存在一些不足。但是,有很多时候,Python的效率并没有想象中的那么夸张。本文对一些Python代码加速运行的技巧进行整理。0.代码优化原则... 查看详情

PYTHON 为啥我的 python IDLE 不能将 numpy 识别为模块,尽管在 cmd 中运行 pythob 时可以正常使用 numpy?

】PYTHON为啥我的pythonIDLE不能将numpy识别为模块,尽管在cmd中运行pythob时可以正常使用numpy?【英文标题】:PYTHONwhywon\'tmypythonIDLErecognisenumpyasamodule,despitenumpybeingusedfinewhenpythobisranincmd?PYTHON为什么我的pythonIDLE不能将numpy识别为模块,... 查看详情

8个python加速运行的小技巧(代码片段)

Python是一种脚本语言,相比C/C++这样的编译语言,在效率和性能方面存在一些不足。但是,有很多时候,Python的效率并没有想象中的那么夸张。本文对一些Python代码加速运行的技巧进行整理。0.代码优化原则... 查看详情

8个python加速运行的小技巧(代码片段)

Python是一种脚本语言,相比C/C++这样的编译语言,在效率和性能方面存在一些不足。但是,有很多时候,Python的效率并没有想象中的那么夸张。本文对一些Python代码加速运行的技巧进行整理。0.代码优化原则... 查看详情

是否可以在 Python 中加速这个循环?

】是否可以在Python中加速这个循环?【英文标题】:IsitpossibletospeedupthisloopinPython?【发布时间】:2017-11-3004:47:34【问题描述】:在numpy.narray(如np.array[map(some_func,x)]或vectorize(f)(x))中映射函数的常规方法无法提供索引。以下代码... 查看详情

用taichi加速python:提速100+倍!(代码片段)

Python已经成为世界上最流行的编程语言,尤其在深度学习、数据科学等领域占据主导地位。但是由于其解释执行的属性,Python较低的性能很影响它在计算密集(比如多重for循环)的场景下发挥作用,实在让人... 查看详情

HTML5 将 youtube 速度从 url 提高 2 倍?

...mp;amp;t=1m1s(1分1秒)来观看从特定时间开始的视频。是否可以使用类似的方法将视频加速2倍 查看详情

收藏|12种numpy&pandas高效技巧

点上方人工智能算法与Python大数据获取更多干货在右上方 ··· 设为星标 ★,第一时间获取资源仅做学术分享,如有侵权,联系删除转载于:机器之心本文分享给大家 12种Numpy和Pandas函数,这些高效的函数... 查看详情

python代码加速100倍,针对excel自动化处理的加速实战!(代码片段)

并发vs并行说到并发编程,我们先来澄清一下并发(Concurrency)和并行(Parallelism)这两个概念,因为这个两个概念的含义是不同的。并行(Parallelism)指的就是在同一时刻,有两个或两个以上的任务的代码在处理器... 查看详情