numba,一个强大的 python 库

news2024/12/25 18:28:43

今天给大家分享一个强大的 python 库,numba

https://github.com/numba/numba

Pandas 是 Python 中流行的数据分析库。然而,随着数据集大小的增长,原生 Python 代码对于滚动窗口计算等关键操作可能会变得很慢。这就是 Numba 用武之地。

Numba 是 Python 的即时编译器,可在运行时将 Python 代码转换为机器代码

Numba 可用于加速 Python 函数,而无需编写任何 C 或 C++ 代码。

在本文中,我们将探讨如何利用 Numba 加速常见的 Pandas 工作流程,例如滚动统计。‍

你将了解启用 Numba 编译所需的简单注释以及如何使用并行执行等选项来调整性能。

Numba 的安装

我们可以直接使用pip 来进行安装。

pip install numba

如何对 Pandas 使用 Numba?

将 Numba 与 Pandas 结合使用有两种方法:

  • 在 pandas 方法中指定 engine=“numba” 关键字

  • 定义你自己的用 @jit 修饰的 Python 函数,并将 DataFrame 或 Series 的底层 NumPy 数组(使用 to_numpy())传递到函数中。

使用 engine=“numba”

你可以通过指定 engine=“numba” 来增强所选 Pandas 方法的执行。

这指示该方法利用 Numba 来加速性能。支持该关键字的方法主要涉及窗口操作,例如:

  • 滚动平均值、中位数、最大值、最小值、总和和标准差等。

  • groupby 滚动平均值、中位数、最大值、最小值、总和和标准差等。

  • expanding 平均值、中位数、最大值、最小值、总和和标准差等。

  • groupby expanding 平均值、中位数、最大值、最小值、总和和标准差等。

# create a sample DataFrame  
data = np.random.rand(int(1e5), 4)  
df = pd.DataFrame(data)  
  
window_size = 10  
# rolling sum with Numba   
rolling_sum = df.rolling(window_size).sum(engine='numba')

上面的代码片段生成一个随机 DataFrame 并使用 Numba 引擎对其执行滚动求和操作,从而优化计算以提高效率。

定义你自己的函数

你还可以定义用 @jit 或 @njit 装饰的 Python 函数,并将 DataFrame 或 Series 的基础 NumPy 数组(使用 to_numpy())传递到函数中。此方法比使用 engine=“numba” 更灵活,因为你可以定义自己的自定义函数。

from numba import njit  
  
# create a sample DataFrame  
data = np.random.rand(int(1e5), 4)  
df = pd.DataFrame(data)  
  
# Define the custom function  
@njit  
def sum_of_squares(x):  
    return np.sum(x**2, axis=0)  
  
result = sum_of_squares(df.to_numpy())

此代码片段使用 Numba 的 @njit 装饰器(即 @jit(nopython=True) 的别名)来定义名为 sum_of_squares 的自定义函数。

它采用 NumPy 数组作为输入并计算沿列的平方和。

该代码生成一个随机 DataFrame,使用 to_numpy() 将其转换为 NumPy 数组,并应用 sum_of_squares 函数计算每列的平方和。结果存储在 result 变量中。

性能比较

我们比较执行时间并评估通过利用 Numba 的即时编译功能获得的潜在加速。

为此,我们在如下三种场景下测量代码的执行时间:有和没有 Numba 优化,以及并行执行。

下面提供了执行这些基准测试的代码:

import time  
import matplotlib.pyplot as plt  
import numba  
import numpy as np  
import pandas as pd  
  
plt.style.use('ggplot')  
# Define the custom rolling apply function  
def root_mean_square(x):  
    return np.sqrt(np.mean(x**2))  
  
def bench(df: pd.DataFrame, use_numba: bool, use_parallel: bool = False, n_times: int = 10):  
    engine = 'numba' if use_numba else None  
    engine_kwargs = {'parallel': True, 'nopython': True} if use_parallel else None  
      
    elapsed_time_list = []  
    for _ in range(n_times):  
        start_time = time.time()  
        df.rolling(window_size).apply(root_mean_square, raw=True, engine=engine, engine_kwargs=engine_kwargs)  
        elapsed_time_list.append(time.time() - start_time)  
    return np.mean(elapsed_time_list)  
  
  
# Generate sample data  
np.random.seed(42)  
data = np.random.rand(int(1e5), 4)  
df = pd.DataFrame(data)  
  
window_sizes = range(10, 1001, 100)  
mean_time_without_numba = []  
mean_time_with_numba = []  
mean_time_with_numba_parallel = []  
# Benchmark the performance for different window sizes  
for window_size in window_sizes:  
    # Without Numba  
    mean_time = bench(df, use_numba=False)  
    mean_time_without_numba.append(mean_time)  
      
    mean_time = bench(df, use_numba=True)  
    mean_time_with_numba.append(mean_time)  
  
    mean_time = bench(df, use_numba=True, use_parallel=True)  
    mean_time_with_numba_parallel.append(mean_time)  
  
mean_time_without_numba = np.array(mean_time_without_numba)  
mean_time_with_numba = np.array(mean_time_with_numba)  
mean_time_with_numba_parallel = np.array(mean_time_with_numba_parallel)  
print("mean_time_without_numba", mean_time_without_numba)  
print("mean_time_with_numba", mean_time_with_numba)  
print("mean_time_with_numba_parallel", mean_time_with_numba_parallel)  
  
fig, ax = plt.subplots(figsize=(8, 6))  
ax.plot(window_sizes, mean_time_without_numba / mean_time_with_numba, label='Numba')  
ax.plot(window_sizes, mean_time_without_numba / mean_time_with_numba_parallel, label='Numba + Parallel')  
  
ax.set_xlabel('Window Size')  
ax.set_ylabel('Speedup')  
ax.set_title('Speedup compared to without Numba: Pandas Rolling Apply')  
ax.legend()  
fig.savefig("numba_speedup_pandas_rolling_apply.png")  

如上图所示,Numba 将 pandas 滚动函数的执行速度提高了 260 倍。

基准测试结果清楚地证明了使用 Numba 在 Pandas 中进行滚动操作所实现的显着性能改进。

  • 与没有 numba 的非优化版本相比,Numba 显着提高了 pandas 滚动的性能。平均执行时间减少了一个数量级。

  • 与没有并行化的 numba 相比,具有并行化的 Numba 进一步增强了性能,实现了额外的加速。

  • 随着窗口大小的增加,加速比降低,这可能是由于所需滚动操作数量的减少。

Numba 即时编译器可以通过为关键函数生成优化的机器代码,将 Pandas 操作加速高达 260 倍。在 Pandas 方法中使用 numba 引擎可以轻松地在列上进行多线程处理。

定义 Numba 修饰的函数可以灵活地优化自定义操作。

尽管存在编译开销等限制,Numba 独特地将 Python 和 Pandas 的生产力与类似 C 的速度结合在一起。

对于处理大型数据集的数据科学家来说,Numba 是加速 Pandas 中重复数值计算的不可或缺的工具。

---------------------------END---------------------------

题外话

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

若有侵权,请联系删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/973432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一种编程语言,

前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python:一种编程语言&…

EVE部署

EVE-NG 镜像导入 IOL 镜像位置:/opt/unetlab/addons/iol/bin/ qemu 镜像位置:/opt/unetlab/addons/qemu/ 设备图标位置:/opt/unetlab/html/images/icons/ EVE-NG 懒人版部署

长胜证券:中特估一带一路央国企将见底反转加速

三季度开始龙头成绩将回转加快向上。(1)2022年第三季度基数环比下降,如2022第2/3单季度成绩增速:我国中铁14%/5%、我邦交建10%/-9%、我国铁建8%/-5%、我国中冶14%/-29%、我国化学50%/11%、北方世界38%/-50%、中工世界80%/20%。(2)在手订单增速高于收入增速&#xff…

K210-CanMV IDE开发软件

K210-CanMV IDE开发软件 界面功能简介连接设备临时运行开机运行程序 界面功能简介 区域①菜单栏:操作文件,使用工具等。 区域②快捷按钮:区域①中的文件和编辑中部分功能的快捷方式。 区域③连接设备:连接设备和程序控制按钮。 …

项目(智慧教室)第二部分,人机交互页面实现,

使用软件: 1.BmCvtST.exe 这是stm32Cubemx工程下的带三方软件。存在STemWin中。 作用: 图片变成.c文件格式。 2.CodeBlock 3.模拟器工程(具体请看上一节) 一。emWin环境的搭建 1.codeBlock下载 开源免费。 2.使用stm的C…

【数据分析】用Python秒懂概率分布!(附完整Python代码实现)

本文涉及的概念分布包括: 随机变量(Random Variable) 密度函数(Density Functions) 伯努利分布(Bernoulli Distribution) 二项式分布(Binomial Distribution) 均匀分布(Uniform Distribution) 泊松分布(Poisson Distribution) 正态分布(Normal Distribution) …

飞行动力学 - 第16节-part3-飞机重心范围 之 基础点摘要

飞行动力学 - 第16节-part3-飞机重心范围 之 基础点摘要 1.飞机允许的重心范围2. 重心后限3. 重心前限4. 重心范围与平尾面积的剪刀图5. 参考资料 1.飞机允许的重心范围 从稳定性角度,重心应尽可能位于中性点 N 0 N_0 N0​之前;从操纵性角度&#xff0c…

java八股文面试[数据库]——mysql主从复制

什么是mysql的主从复制? MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点…

SEAN代码(2)

输入image,label分别经过生成器和判别器。 经过生成器计算的是损失和产生的图片。并且在内部损失进行反向传播,优化器进行更新。 在pix2pix_model内部:首先对输入数据进行预处理。 def preprocess_input(self, data):# move to GPU and ch…

【C++进阶(四)】STL大法--list深度剖析list迭代器问题探讨

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C   🔝🔝 链表list 1. 前言2. list的使用2.1 list的构造函…

小企业数字化经营模式是什么?

小型企业的数字化经营模式是指这些企业如何利用数字技术和互联网来创造、交付和获取价值。数字化极大地影响了小型企业的运营方式、与客户的互动以及开展业务的方式。以下是小型企业数字化经营模式的一些关键组成部分: 1.在线形象和品牌:通过网站、社交…

【机器视觉】喇叭的外圆以及金属内圆的同心度视觉检测--康耐德智能

客户的需求 检测内容 喇叭的外圆以及金属内圆的同心度测量 检测要求 精度0.02mm,速度没要求,抽检产品。 评估 视觉可行性分析 对贵司的样品进行了光学实验,并进行图像处理,原则上可以使用机器视觉进行测试测量。 结果 对所有样…

【TI毫米波雷达笔记】SOC外设中断监听功能(Listen)初始化配置及驱动(以IWR6843AOP为例)

【TI毫米波雷达笔记】SOC外设中断监听功能&#xff08;Listen&#xff09;初始化配置及驱动&#xff08;以IWR6843AOP为例&#xff09; #include <ti/drivers/soc/soc.h>SOC初始化以后 可以配置监听以配置中断回调来查看当前运行情况&#xff1a; 采用函数SOC_register…

书单怎么制作?有哪些技巧和注意事项?

书单是指将自己喜欢的书籍、影视作品等进行整理和推荐&#xff0c;供他人参考的清单。它可以是一个人的私人书单&#xff0c;也可以是一个团队或者社群共享的书单&#xff0c;我们在一些短视频媒体上应该都有看到过一些制作的书单视频分享&#xff0c;那么如果我们也想上传书单…

7 个适合初学者的项目,可帮助您开始使用 ChatGPT

推荐&#xff1a;使用 NSDT场景编辑器快速搭建3D应用场景 从自动化日常任务到预测复杂模式&#xff0c;人工智能正在重塑行业并重新定义可能性。 当我们站在这场人工智能革命中时&#xff0c;我们必须了解它的潜力并将其整合到我们的日常工作流程中。 然而。。。我知道开始使…

【真题解析】系统集成项目管理工程师 2023 年上半年真题卷(案例分析)

本文为系统集成项目管理工程师考试(软考) 2023 年上半年真题(全国卷),包含答案与详细解析。考试共分为两科,成绩均 ≥45 即可通过考试: 综合知识(选择题 75 道,75分)案例分析(问答题 4 道,75分)案例分析(问答题*4)试题一试题二试题三试题四案例分析(问答题*4) …

SwiftUI实现iPad多任务分屏

1. 概述 iPadOS引入了多任务分屏功能&#xff0c;使用户能够同时在一个屏幕上使用多个应用程序。这为用户提供了更高效的工作环境&#xff0c;可以在同一时间处理多个任务。 iPad多任务分屏有两种常见的模式&#xff1a;1/2分屏和Slide Over&#xff08;滑动覆盖&#xff09;…

sentinel blockHandler不生效

sentinel blockHandler不生效: package org.bc.sentinel.controller;import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockException; import org.apache.commons.lang3.RandomUtils; import org.springfram…

blender 场景灯光基础设置

在 blender 中&#xff0c;打光分为两个部分&#xff0c;一个是世界光&#xff0c;一个是场景光&#xff1b; 世界光&#xff1a; 世界光&#xff1a;在 Blender 中&#xff0c;世界光指的是用于设置场景整体照明的环境光。它可以通过调整颜色、强度、阴影等参数来影响场景的…

JAVA:错误: 找不到或无法加载主类 xx.xx.xx类

报错图片&#xff1a; 报错原因&#xff1a; 加载是没有定义项目的根目录或主要代码的位置。这个根目录是整个项目的起点&#xff0c;包含了所有的源代码文件和其他必要的资源文件 解决方法&#xff1a;定义根目录