安装numba和使用numba加速python程序

本文介绍如何通过Numba库加速Python程序的计算速度。详细步骤包括安装依赖、配置LLVM环境及Numba安装方法。通过实例展示使用@jit注解后的性能提升可达6.6倍。

这是从其他博客粘贴过来,备份的。原文在:http://www.cnblogs.com/freeweb/p/6652607.html
使用Cython来加速python程序的运行速度,但是相对来说程序改动较大,这次就说一种简单的方式来加速python计算速度的方法,就是使用numba库来进行,numba库可以使用JIT技术即时编译,达到高性能,另外也可以使用cuda GPU的计算能力来加速,对python来说是一个提速非常好的工具库,使用简单,但是安装稍微复杂一些,具体过程如下:

  安装numba需要的依赖如下:

  Python依赖有(按顺序):

  setuptools

  enum34 pypi下载地址:https://pypi.python.org/pypi/enum34

  funcsigs 下载地址:https://pypi.python.org/pypi/funcsigs/

  singledispatch 下载地址:https://pypi.python.org/pypi/singledispatch/

  llvmlite https://pypi.python.org/pypi/llvmlite/ 这个下载的是最新版的0.16.0

  上面这些python依赖的安装很简单,都是解压完然后执行python setup.py install即可

  其中安装llvmlite的时候需要最艰难的一步,llvmlite需要llvm环境的支持,并且0.16.0的版本必须依赖于3.9.x的环境,llvm官网下载地址是:http://releases.llvm.org/download.html 最新的版本是4.0.0,记住要下载3.9.1的,如果安装了4.0.0那么安装llvmlite的时候会提示llvm版本问题,下载好的包如下:

  llvm-3.9.1.src.tar.xz

  cfe-3.9.1.src.tar.xz  #(就是Clang source code (.sig))

  clang-tools-extra-3.9.1.src.tar.xz

  compiler-rt-3.9.1.src.tar.xz

  依次执行如下命令解压并操作:

xz -d llvm-3.9.1.src.tar.xz
xz -d cfe-3.9.1.src.tar.xz
xz -d clang-tools-extra-3.9.1.src.tar.xz
xz -d compiler-rt-3.9.1.src.tar.xz
tar -xvf llvm-3.9.1.src.tar
tar -xvf cfe-3.9.1.src.tar
tar -xvf clang-tools-extra-3.9.1.src.tar
tar -xvf compiler-rt-3.9.1.src.tar
mv cfe-3.9.1.src clang
mv clang llvm-3.9.1.src/tools/
mv clang-tools-extra-3.9.1.src extra
mv extra/ llvm-3.9.1.src/tools/clang/
mv compiler-rt-3.9.1.src compiler-rt
mv compiler-rt llvm-3.9.1.src/projects/

  放好之后开始编译源代码,编译需要使用cmake 如果没有安装需要安装,下面开始编译,编译过程非常长,64G服务器还得半个小时左右,并且编译出来的文件有20多G大小,硬盘也要留够,为防止编译过程中断,尽量使用screen会话执行:

mkdir build-3.9
cd build-3.9
cmake -G "Unix Makefiles" ../llvm-3.9.1.src
make -j4
make install

  完了之后可以删除原来的代码目录

  然后如果接下来再安装llvmlite的话,如果报cannot find -lstdc++的错误的话那么是缺少下面的包,可以使用yum安装:

yum -y install glibc-static
yum -y install libstdc++-devel
yum -y install libstdc++-static

  必须注意第三个一定要安装,如果不安装的话那么一直会报上面的错误,也可以下载libstdc++-static包进行离线安装,下载地址是:https://pkgs.org/download/libstdc++-static 下载之后使用rpm安装成功之后,再次安装llvmlite就成功了

  然后开始安装numba,numba下载地址是:http://numba.pydata.org/download.html 这里我们下载最新版的0.31.0,下载之后和安装普通依赖一样执行setup.py就可以了,最后安装完成numba就可以使用了,下面写一个小案例来看一下加速后的程序和加速前的程序的区别,借用官网上最经典的例子:

#!/usr/bin/env python
# coding=utf-8
from numba import jit
from numpy import arange
import time

@jit
def sum2d(arr):
    M, N = arr.shape
    result = 0.0
    for i in range(M):
        for j in range(N):
            result += arr[i,j]
    return result

a = arange(9).reshape(3,3)
start_time = time.time()
for i in range(10000000):
    sum2d(a)
end_time = time.time()
print (end_time - start_time)

  这里使用numpy生成三行三列的矩阵,[[0,1,2],[3,4,5],[6,7,8]]然后做二维累加计算,值显然应该是36,这里做了10000000次这样的计算,使用@jit注解可以直接的使用numba jit技术实时编译,从而提高速度,最终运行时间大约是3.86s,如果去掉注解的话那么运行时间大约是25.45s从这里可以看出来大约有6.6倍的性能提升,所以使用numba加速python程序确实是方便简单

分类: 00.dev - Python,02.Linux

### 2D语义点云建图方法与工具 #### 方法概述 2D语义点云建图涉及将传感器数据转换成带有语义标签的地图。这种方法不仅记录几何信息,还赋予环境中的物体特定类别标签,从而增强机器人或自主系统的理解能力[^1]。 #### 数据获取与预处理 激光雷达(LiDAR)摄像头是最常用的两种传感器组合用于采集二维平面内的空间信息。通过同步这两类设备的数据流可以得到带颜色的点云资料。对于原始点云而言,降噪平滑操作必不可少;而对于图像,则需进行校正、分割以及特征提取等前期准备工作。 #### 特征匹配与姿态估计 利用ORB-SLAM, LSD-SLAM这类开源框架能够有效地完成实时定位与地图构建任务(SLAM)[^3]。在此基础上加入深度学习模型如Mask R-CNN来识别场景内不同类型的对象并标注其边界框位置。随后借助PnP算法求解相机相对于世界坐标系的姿态变换矩阵R,t,进而更新全局地图中各节点间的相对关系。 #### 图优化技术应用 Bundle Adjustment (BA)作为一种经典的非线性最小二乘问题求解器被广泛应用于多视角几何约束下的参数精炼过程中。考虑到直接对大规模稀疏网络实施整体调整效率低下,研究者们探索出了诸如Hierarchical BA这样的分级策略——先针对局部区域做密集化处理再逐步向外扩展直至覆盖整个作业范围。此外还有Keyframe-based BA仅选取最具代表性的若干时刻作为待修正样本集以减少冗余计算量的同时保持较高的精度水平。 #### 实现工具推荐 - **ROS(Robot Operating System)**: 提供丰富的库函数支持从驱动程序加载到高级功能开发的一站式解决方案; - **OpenCV**: 计算机视觉领域不可或缺的基础组件之一,擅长处理各类图形运算任务; - **Point Cloud Library(PCL)**: 集成了大量关于点云计算方面的高效算法模块可供调用; - **TensorFlow/PyTorch**: 构建卷积神经网络(CNN),实现目标检测分类等功能的关键平台。 ```python import numpy as np from sklearn.cluster import DBSCAN from pclpy import pcl def preprocess_point_cloud(point_cloud_data): """Preprocess raw LiDAR data.""" # Convert to PCL format cloud = pcl.PointCloud() cloud.from_array(np.array(point_cloud_data)) # Downsample using Voxel Grid filter voxel_grid_filter = cloud.make_voxel_grid_filter() voxel_grid_filter.set_leaf_size(0.05, 0.05, 0.05) filtered_cloud = voxel_grid_filter.filter() return filtered_cloud.to_array() def segment_objects(filtered_cloud): """Segment objects from the scene based on Euclidean clustering.""" tree = spatial.KDTree(filtered_cloud[:, :2]) db = DBSCAN(eps=0.5, min_samples=10).fit(tree.data) labels = db.labels_ n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0) segmented_points = [] for i in range(n_clusters_): class_member_mask = (labels == i) xyz = filtered_cloud[class_member_mask] segmented_points.append(xyz.tolist()) return segmented_points ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值