使用向量化、矩阵化、cuda等不同方法加速python程序
第一次写知乎文章,本文中如有错误请不吝赐教,各位大大多多包涵。
本文是一次实验室组会的分享内容,对于机器视觉各类问题中经常需要处理大量计算任务的情况,以一个计算点云距离的例子来观察不同处理方法在python编程中对速度的影响。运行程序的电脑CPU型号:i9-9900X,GPU型号:RTX 2080 Ti ,python版本3.8.1 ,使用Jupyter lab编写。
问题描述:
在python中,使用普通方法、向量化、矩阵化、cuda等方法加速计算两组点云间各点的距离
# 初始化数据
import numpy as np
import time
n, m = 10000, 15000
a = np.random.random((n,3)) # 点云A中有n组点
b = np.random.random((m,3)) # 点云B中有m组点普通方法
通过嵌套的循环,计算所有点的距离,距离计算公式为:
# 普通计算距离
def cal_distance(a,b):
'''输入a是第一组点,b是第二组点 a=[x,y,z] b=[x,y,z]输出距离'''
d = np.sqrt(np.square(a[0] - b[0]) + np.square(a[1] - b[1]) + np.square(a[2] - b[2]))
return d
# 开始计算
t_1_start = time.time()
common_result = []
for j in range(m):
for i in range(n):
common_result.append(cal_distance(a[i],b[j]))
# 结束
t_1_end = time.time()
t_1 = t_1_end - t_1_start
print('普通计算时间:', t_1, 's')普通计算时间: 950.3101623058319 s
common_result = np.array(common_result).reshape(m,n).T # 元素按照dij表示点云A中第i个点到点云B中第j个点的距离值的格式排列向量化方法
将数据A以重复m次的方式扩展,数据B以复制的方式扩展,实现A中任一点对B中所有点的对应关系。即: