0

0

使用 Numba 实现 DataFrame 中折叠计算的高效向量化

心靈之曲

心靈之曲

发布时间:2026-02-13 17:17:01

|

830人浏览过

|

来源于php中文网

原创

使用 Numba 实现 DataFrame 中折叠计算的高效向量化

本文介绍如何借助 numba 加速具有状态依赖性的逐行折叠运算(如 `d[i] = d[i-1] * a[i] + b[i]`),在保持逻辑清晰的同时显著提升大数据量下的计算性能,避免传统 python 循环或 `reduce` 的低效问题。

在 Pandas 中处理具有递推依赖关系的列计算(例如当前值依赖前一行结果)时,常见的 apply()、iterrows() 或 functools.reduce() 方法虽逻辑直观,但难以真正向量化,性能随数据规模增长而急剧下降。典型场景如时间序列状态更新、滚动加权累积、信号滤波等——本文示例中的列 D 正是此类“折叠过程”(folding process):

  • D[0] 由初始值(此处为 C[0] = 10.0)设定;
  • 对 i ≥ 1,D[i] = D[i-1] * A[i] + B[i],即每步需复用上一步输出。

遗憾的是,纯 NumPy/Pandas 无法对此类带内部状态的迭代进行完全向量化——因为后续元素的计算严格依赖前序结果,违背了向量化要求的“各元素独立可并行计算”前提。此时,Numba 成为兼顾性能与简洁性的最优解:它通过 JIT 编译将 Python 循环编译为原生机器码,在保留循环语义的同时获得接近 C 语言的速度。

以下为完整实现方案:

import pandas as pd
import numpy as np
from numba import njit

# 构造示例数据
df = pd.DataFrame({
    'A': [np.nan, 0.5, 0.5, 0.5, 0.5], 
    'B': [np.nan, 3, 4, 1, 2], 
    'C': [10, np.nan, np.nan, np.nan, np.nan]
})

# 定义 Numba 加速函数
@njit
def calculate_fold(A: np.ndarray, B: np.ndarray, start_val: float) -> np.ndarray:
    """
    执行折叠计算:D[0] = start_val; D[i] = D[i-1] * A[i] + B[i] (i >= 1)
    注意:A 和 B 应为一维 float64 数组,且长度一致
    """
    n = len(A)
    out = np.empty(n, dtype=np.float64)
    out[0] = start_val  # 首项由初始值确定

    # 从索引 1 开始迭代(A[0] 和 B[0] 在本例中为 NaN,不参与计算)
    for i in range(1, n):
        # 安全处理 NaN:若 A[i] 或 B[i] 为 NaN,则结果设为 NaN
        if np.isnan(A[i]) or np.isnan(B[i]):
            out[i] = np.nan
        else:
            out[i] = out[i-1] * A[i] + B[i]

    return out

# 应用计算(自动提取底层 NumPy 数组,规避 Pandas 开销)
df["D"] = calculate_fold(
    df["A"].to_numpy(dtype=np.float64, na_value=np.nan),
    df["B"].to_numpy(dtype=np.float64, na_value=np.nan),
    start_val=10.0
)

print(df)

输出结果与预期一致:

CEIFI
CEIFI

CEIFI提供国内外最新最全面的AI工具、资源和资讯

下载
     A    B     C     D
0  NaN  NaN  10.0  10.0
1  0.5  3.0   NaN   8.0
2  0.5  4.0   NaN   8.0
3  0.5  1.0   NaN   5.0
4  0.5  2.0   NaN   4.5

关键优势说明

  • 性能跃升:在百万级行数据上,Numba 版本通常比纯 Python 循环快 100–1000 倍,且内存占用更低;
  • 类型安全:@njit 强制静态类型,编译时即捕获数组类型/维度错误;
  • 无缝集成:仅需将 Pandas Series 转为 .to_numpy(),即可直接传入,无需重构数据流。

⚠️ 注意事项

  • 初始值 start_val 必须显式传入(不能从 df['C'] 自动提取,因 Numba 函数不支持 Pandas 对象);若需动态获取(如 df.loc[0, 'C']),应在调用前完成提取;
  • Numba 不支持 pd.NA 或复杂缺失值逻辑,建议统一用 np.nan 并在函数内显式检查;
  • 首次调用会触发编译开销,但后续调用均为原生执行——适合重复计算场景;
  • 若逻辑进一步复杂化(如条件分支增多、多状态变量),可扩展为 @njit 的结构体返回,或改用 @guvectorize 实现更高级的向量化模式。

综上,当面对“不可并行但需高频执行”的递推计算时,Numba 并非权宜之计,而是 Pandas 生态中实现高性能数值折叠的标准实践路径。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

73

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

4

2026.01.31

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

322

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

198

2025.07.04

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

15

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

10

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

7

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

8

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

2

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号