高效生成分段线性采样点:使用 Polars 向量化操作替代 Python 循环
发布时间 - 2025-12-27 00:00:00 点击率:次本文介绍如何利用 polars 的 `int_ranges` 和 `explode` 实现高效行级映射,将每行 `(t_left, t_right, counts)` 扩展为 `counts` 个等距时间点(排除左端点),避免慢速 python 循环,大幅提升百万级数据处理性能。
在数据分析中,常需将区间 [t_left, t_right] 按指定数量 counts 划分为等距子区间,并采集右端点(即 np.linspace(t_left, t_right, counts + 1)[1:])。若用传统 df.rows() 遍历 + np.linspace,在百万行数据上极易成为性能瓶颈——Python 循环开销大,且 numpy 调用无法向量化跨行计算。
Polars 提供了更优解:全程向量化 + 行展开(explode)。核心思路是:
- 将每行转换为一个整数序列 i ∈ [1, counts](对应第 1 到第 counts 个采样点索引);
- 计算每个区间的步长 step = (t_right - t_left) / counts;
- 利用线性公式 t = t_left + step × i 直接生成目标时间点;
- 最后通过 .explode() 展开所有序列,再 .to_list() 输出扁平列表。
以下是完整、可复现的优化实现:
import polars as pl
import numpy as np
# 示例数据(支持百万级规模)
size = 1_000_000
df = pl.DataFrame({
"t_left": np.random.rand(size),
"t_right": np.random.rand(size) + 1,
"counts": [1] * size, # 可替换为任意正整数数组
})
# ✅ 向量化核心逻辑(无循环、无 Python 解释器开销)
times_series = (
df.select(
start=pl.col("t_left"),
step=(pl.col("t_right") - pl.col("t_left")) / pl.col("counts"),
i=pl.int_ranges(1, pl.col("counts") + 1) # 生成 [1, 2, ..., counts]
)
.explode("i") # 展开所有 i 序列 → 每行变多行
.s
elect(res=pl.col("start") + pl.col("step") * pl.col("i"))
.get_column("res")
)
# 输出为标准 Python list,可直接传入 matplotlib.hist 等函数
times: list[float] = times_series.to_list()✅ 关键优势说明:
- pl.int_ranges(start, end) 生成惰性整数序列,内存友好;
- explode() 在底层 C/Rust 层完成展开,比 Python extend() 快数十倍;
- 所有算术运算(+, /, *)均为 Polars 原生向量化操作,自动并行;
- 不依赖外部 NumPy 循环,规避 GIL 限制。
⚠️ 注意事项:
- counts 列必须为正整数(i64),若含零或负值,int_ranges 将报错或返回空序列;建议预处理:df = df.filter(pl.col("counts") > 0);
- 若需包含左端点(即 linspace(..., endpoint=False) 等效效果),可将 int_ranges(1, ...) 改为 int_ranges(0, ...) 并调整公式;
- 内存峰值与总采样点数成正比(例如 sum(counts) 达千万级时,注意 RAM 容量)。
该方法在真实百万行测试中,相较原始循环提速 50–100 倍以上,同时代码简洁、逻辑清晰,是 Polars “以数据流思维替代过程式思维”的典型实践。
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
如何为不同团队 ID 动态生成多个“认领值班”按钮
JS实现鼠标移上去显示图片或微信二维码
java ZXing生成二维码及条码实例分享
Laravel Fortify是什么,和Jetstream有什么关系
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
JS经典正则表达式笔试题汇总
香港服务器部署网站为何提示未备案?
Android滚轮选择时间控件使用详解
怎样使用JSON进行数据交换_它有什么限制
实例解析angularjs的filter过滤器
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
如何在Windows虚拟主机上快速搭建网站?
js实现点击每个li节点,都弹出其文本值及修改
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
EditPlus中的正则表达式实战(6)
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
Laravel如何保护应用免受CSRF攻击?(原理和示例)
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Laravel如何使用查询构建器?(Query Builder高级用法)
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
如何快速完成中国万网建站详细流程?
Laravel如何自定义分页视图?(Pagination示例)
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
JavaScript模板引擎Template.js使用详解
Laravel如何实现用户密码重置功能?(完整流程代码)
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
javascript读取文本节点方法小结
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
Laravel如何实现用户注册和登录?(Auth脚手架指南)
如何在Windows环境下新建FTP站点并设置权限?
如何用搬瓦工VPS快速搭建个人网站?
常州企业网站制作公司,全国继续教育网怎么登录?
Java垃圾回收器的方法和原理总结
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
无锡营销型网站制作公司,无锡网选车牌流程?
如何快速搭建FTP站点实现文件共享?
C#如何调用原生C++ COM对象详解
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
Laravel怎么实现模型属性的自动加密
网站制作软件免费下载安装,有哪些免费下载的软件网站?
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
制作电商网页,电商供应链怎么做?
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
高防服务器:AI智能防御DDoS攻击与数据安全保障
如何快速重置建站主机并恢复默认配置?


elect(res=pl.col("start") + pl.col("step") * pl.col("i"))
.get_column("res")
)
# 输出为标准 Python list,可直接传入 matplotlib.hist 等函数
times: list[float] = times_series.to_list()