# 技术背景

Numpy是在Python中非常常用的一个库，不仅具有良好的接口文档和生态，还具备了最顶级的性能，这个库很大程度上的弥补了Python本身性能上的缺陷。虽然我们也可以自己使用Cython或者是在Python中调用C++的动态链接库，但是我们自己实现的方法不一定有Numpy实现的快，这得益于Numpy对于SIMD等技术的深入实现，把CPU的性能发挥到了极致。因此我们只能考虑弯道超车，尝试下能否用自己实现的GPU的算法来打败Numpy的实现。

# 矩阵的元素乘

```# cuda_test.py

import numpy as np
import time
from numba import cuda
cuda.select_device(1)

@cuda.jit
def CudaSquare(x):
i, j = cuda.grid(2)
x[i][j] *= x[i][j]

if __name__ == '__main__':
np.random.seed(1)
array_length = 2**10
random_array = np.random.rand(array_length, array_length)
random_array_cuda = cuda.to_device(random_array)
square_array = np.square(random_array)
CudaSquare[(array_length,array_length),(1,1)](random_array_cuda)
square_array_cuda = random_array_cuda.copy_to_host()
print (np.sum(square_array-square_array_cuda))```

```\$ python3 cuda_test.py
0.0```

# numba.cuda加速效果测试

```# cuda_test.py

import numpy as np
import time
from tqdm import trange
from numba import cuda
cuda.select_device(1)

@cuda.jit
def CudaSquare(x):
i, j = cuda.grid(2)
x[i][j] *= x[i][j]

if __name__ == '__main__':
numpy_time = 0
numba_time = 0
test_length = 1000
for i in trange(test_length):
np.random.seed(i)
array_length = 2**10
random_array = np.random.rand(array_length, array_length)
random_array_cuda = cuda.to_device(random_array)
time0 = time.time()
square_array = np.square(random_array)
time1 = time.time()
CudaSquare[(array_length,array_length),(1,1)](random_array_cuda)
time2 = time.time()
numpy_time += time1-time0
numba_time += time2-time1
print ('The time cost of numpy is {}s for {} loops'.format(numpy_time, test_length))
print ('The time cost of numba is {}s for {} loops'.format(numba_time, test_length))```

```\$ python3 cuda_test.py
100%|██████████████████████████████████████| 1000/1000 [00:13<00:00, 76.83it/s]
The time cost of numpy is 1.4523804187774658s for 1000 loops
The time cost of numba is 0.46444034576416016s for 1000 loops```

```# cuda_test.py

import numpy as np
import time
from tqdm import trange
from numba import cuda
cuda.select_device(1)

@cuda.jit
def CudaSquare(x):
i, j = cuda.grid(2)
x[i][j] *= x[i][j]

if __name__ == '__main__':
numpy_time = 0
numba_time = 0
test_length = 1000
for i in trange(test_length):
np.random.seed(i)
array_length = 2**12
random_array = np.random.rand(array_length, array_length)
random_array_cuda = cuda.to_device(random_array)
time0 = time.time()
square_array = np.square(random_array)
time1 = time.time()
CudaSquare[(array_length,array_length),(1,1)](random_array_cuda)
time2 = time.time()
numpy_time += time1-time0
numba_time += time2-time1
print ('The time cost of numpy is {}s for {} loops'.format(numpy_time, test_length))
print ('The time cost of numba is {}s for {} loops'.format(numba_time, test_length))```

```\$ python3 cuda_test.py
100%|████████████████████████████████████████| 100/100 [00:22<00:00,  4.40it/s]
The time cost of numpy is 4.878739595413208s for 100 loops
The time cost of numba is 0.3255774974822998s for 100 loops```

# 总结概要

Numpy这个库在Python编程中非常的常用，不仅在性能上补足了Python语言的一些固有缺陷，还具有无与伦比的强大生态。但是即使都是使用Python，Numpy也未必就达到了性能的巅峰，对于我们自己日常中使用到的一些计算的场景，针对性的使用CUDA的功能来进行GPU的优化，是可以达到比Numpy更高的性能的。

# 版权声明

0 条评论

• ### Python实现GPU加速的基本操作

之前写过一篇讲述如何使用pycuda来在Python上写CUDA程序的博客。这个方案的特点在于完全遵循了CUDA程序的写法，只是支持了一些常用函数的接口，如果你...

• ### Python | 加一行注释，让你的程序提速10+倍！numba十分钟上手指南

之前的文章《源代码如何被计算机执行》已经提到计算机只能执行二进制的机器码，C、C++等编译型语言依靠编译器将源代码转化为可执行文件后才能运行，Python、Ja...

• ### 用CUDA写出比Numpy更快的规约求和函数

在前面的几篇博客中我们介绍了在Python中使用Numba来写CUDA程序的一些基本操作和方法，并且展示了GPU加速的实际效果。在可并行化的算法中，比如计算两个...

• ### numba，让你的Python飞起来！

python由于它动态解释性语言的特性，跑起代码来相比java、c++要慢很多，尤其在做科学计算的时候，十亿百亿级别的运算，让python的这种劣势更加凸显。

• ### 教你几个Python技巧，让你的循环和运算更高效！

在 24式加速你的Python中介绍对循环的加速方法中，一个办法就是采用 Numba 加速，刚好最近看到一篇文章介绍了利用 Numba 加速 Python ，文...

• ### [Python技巧]如何加快循环操作和Numpy数组运算速度

在 24式加速你的Python中介绍对循环的加速方法中，一个办法就是采用 Numba 加速，刚好最近看到一篇文章介绍了利用 Numba 加速 Python ，文...

• ### 用Numba加速Python代码

说这句话的人也没有错。与许多其他编程语言相比，Python很慢。Benchmark game有一些比较不同编程语言在不同任务上的速度的可靠的基准。

• ### GPU加速02:超详细Python Cuda零基础入门教程，没有显卡也能学！

Python是当前最流行的编程语言，被广泛应用在深度学习、金融建模、科学和工程计算上。作为一门解释型语言，它运行速度慢也常常被用户诟病。著名Python发行商A...

• ### GPU加速04:将CUDA应用于金融领域，使用Python Numba加速B-S期权估值模型

本文为英伟达GPU计算加速系列的第四篇，主要基于前三篇文章的内容，以金融领域期权估值案例来进行实战练习。前三篇文章为：

• ### 使用Python写CUDA程序

使用Python写CUDA程序有两种方式： * Numba * PyCUDA

• ### 用 Numba 加速 Python 代码，变得像 C++ 一样快

注意： 这篇文章的 Jupyter Notebook 代码在我的 Github 上：SpeedUpYourAlgorithms-Numba

• ### Python高性能计算库——Numba

摘要： 在计算能力为王的时代，具有高性能计算的库正在被广泛大家应用于处理大数据。例如：Numpy，本文介绍了一个新的Python库——Numba， 在计算性能方...

• ### nvidia-rapids︱cuDF与pandas一样的DataFrame库

cuDF（https://github.com/rapidsai/cudf）是一个基于Python的GPU DataFrame库，用于处理数据，包括加载、连接、...

• ### 7年程序员贡献出来的10大Python开源免费工具！

毫无疑问，Python是最流行的语言之一，其成功的原因之一是它为科学计算提供了广泛的报道。 在这里，我们仔细研究用于机器学习和数据科学的十大Python工具。学...

• ### 如何在 GPU 上加速数据科学

数据科学家需要算力。无论您是用 pandas 处理一个大数据集，还是用 Numpy 在一个大矩阵上运行一些计算，您都需要一台强大的机器，以便在合理的时间内完成这...

• ### 如何在 GPU 上加速数据科学

我们认为使用大型模型架构和相同数据在XLNet 和BERT之间进行公平的比较研究具有重要的科学价值。

• ### Python3实现打格点算法的GPU加速

在数学和物理学领域，总是充满了各种连续的函数模型。而当我们用现代计算机的技术去处理这些问题的时候，事实上是无法直接处理连续模型的，绝大多数的情况下都要转化成一个...

• ### 嫌Python太慢但又不想学C/C++？来了解下JIT技术

Python 是门多才多艺的语言，既可以写后端，也可以做数据分析，既可以智能化运维，也可以搞渗透，既可以写爬虫，又可以做机器学习深度学习。然而，Python 的...

• ### 使用numba加速python科学计算

python作为一门编程语言，有非常大的生态优势，但是其执行效率一直被人诟病。纯粹的python代码跑起来速度会非常的缓慢，因此很多对性能要求比较高的pytho...