1秒处理1亿行,这8个Python库彻底让Excel消失

📅 发布时间:2026/7/5 16:13:06 👁️ 浏览次数:
1秒处理1亿行,这8个Python库彻底让Excel消失
处理数据的时候我发现 Excel 有时候不好用不是说它的功能不好用而是它的隐形转换和不可复现输在起跑线上了。日期格式错乱、大文件卡死、逻辑难以追踪这些问题在工程化项目中是致命的。所以我整理了一套 Python 工具栈。它们不搞花哨的噱头只解决具体的问题。DuckDB轻松搞定亿级数据如果在单机上处理几百兆到几 GB 的数据Pandas 的内存占用简直让我抓狂。DuckDB 的出现填补了 SQLite 和分布式数据库之间的空白。它是一个进程内的 OLAP 数据库最大的特点是零配置和向量化计算。DuckDB 可以直接对 CSV、Parquet 或 JSON 文件执行 SQL 查询无需将数据全部加载到内存。import duckdb # 直接对 Parquet 文件执行 SQL无需建库建表 # 这里的 query 类似于 Pandas 的 dataframe但计算是在 DuckDB 引擎中完成的 result duckdb.sql( SELECT department, AVG(salary) as avg_salary FROM employees.parquet WHERE join_date 2022-01-01 GROUP BY department ORDER BY avg_salary DESC ).df() print(result)Ibis写一次代码到处运行Ibis 和 DuckDB 是目前数据工程领域的黄金搭档。Ibis 将业务逻辑与执行引擎分离这也是它的核心。可以使用类似 Pandas 的 Python API 来编写查询逻辑后端可以无缝切换为 DuckDB、ClickHouse、BigQuery 甚至是 PySpark。使用 Ibis 驱动 DuckDB 时既享受了 Python 代码的优雅和类型检查又利用了 DuckDB 极速的执行引擎。一举两得棒棒哒。import ibis # 连接到 DuckDB 后端也可以是 SQLite, Postgres 等 con ibis.duckdb.connect() # 惰性读取数据此时并未真正加载 table con.read_csv(sales_data.csv) # 构建查询表达式 expr ( table.filter(table[status] completed) .group_by(region) .aggregate(total_revenuetable[amount].sum()) .order_by(ibis.desc(total_revenue)) ) # 只有调用 execute() 时才会生成 SQL 并执行 print(expr.execute())Polars多线程时代的 DataFramePandas 是单线程的而 Polars 是用 Rust 编写的天生支持并行计算。在处理大规模数据集时Polars 的速度通常比 Pandas 快数倍。它的设计理念采用了“惰性求值”Lazy Evaluation先构建查询计划经优化器优化后再执行这能极大减少内存开销。import polars as pl # 扫描文件而非读取启用 Lazy 模式 q ( pl.scan_csv(large_dataset.csv) .filter(pl.col(age) 30) .select([name, salary, department]) .group_by(department) .agg(pl.col(salary).mean().alias(avg_salary)) ) # collect() 触发实际计算 df q.collect() print(df)PyArrow Compute底层的计算基石PyArrow 不仅仅是数据格式标准其 compute 模块提供了一套高性能的向量化计算函数。很多现代数据工具包括 Pandas 2.0底层都在使用它。如果需要对数组进行极速的数学运算或字符串处理且不想引入 DataFrame 的额外开销可以考虑一下 PyArrow Compute。import pyarrow as pa import pyarrow.compute as pc # 创建 Arrow 数组 arr_a pa.array([10, 20, 30, 40, None]) arr_b pa.array([2, 4, 5, 8, 1]) # 使用计算内核进行向量化乘法自动处理 None 值 result pc.multiply(arr_a, arr_b) # 过滤数据 mask pc.greater(result, 50) filtered pc.filter(result, mask) print(filtered)TinyDB面向文档的轻量级存储并非所有项目都需要 PostgreSQL。对于配置文件管理、小型爬虫数据存储或单机小工具TinyDB 非常合适。它是一个纯 Python 编写的文档型数据库数据存储在 JSON 文件中API 像操作 Python 列表一样自然。from tinydb import TinyDB, Query db TinyDB(local_storage.json) User Query() # 插入数据 db.insert({name: Alice, role: admin, points: 85}) db.insert({name: Bob, role: user, points: 60}) # 查询数据 results db.search(User.role admin) print(results)Rill开发者的 BI 工具虽然 Rill 更像是一个工具而非传统的 Python 库但它在现代 Python 数据栈中地位独特。Rill 基于 DuckDB能够快速读取本地数据CSV, Parquet并瞬间生成交互式的 BI 仪表盘。它解决了“为了看个图表还要搭一套 Superset”的痛点非常适合快速探索数据分布。Numba让 Python 跑出 C 的速度当代码中包含大量原生for循环如科学计算、复杂算法时Python 的解释器性能往往成为瓶颈。Numba 是一个 JIT即时编译器通过加一行装饰器就能将 Python 函数编译成机器码运行。from numba import jit import time # 不使用 jit 时Python 循环较慢 # 使用 nopythonTrue 强制生成机器码 jit(nopythonTrue) def heavy_computation(n): total 0 for i in range(n): total i * 2 return total start time.time() print(heavy_computation(100_000_000)) print(f耗时: {time.time() - start:.4f} 秒)Bonobo轻量级 ETL 框架对于不需要 Airflow 这种重型调度系统的数据迁移任务Bonobo 提供了一种基于图Graph的轻量级 ETL 方案。它使用纯 Python 代码定义数据流向逻辑清晰非常适合处理中小规模的数据清洗和转换任务。import bonobo def extract(): yield {id: 1, name: Item A } yield {id: 2, name: Item B } def transform(row): return { id: row[id], name_clean: row[name].strip().upper() } def load(row): print(fLoading: {row}) def get_graph(**options): graph bonobo.Graph() graph.add_chain(extract, transform, load) return graph if __name__ __main__: # 实际运行时使用 bonobo run parser bonobo.get_argument_parser() with bonobo.parse_args(parser) as options: bonobo.run(get_graph(**options))上述库涵盖了从数据存储、计算引擎到 ETL 流程的各个环节Python的库需要的肯定是 Python 环境。而且码农怎么可能只有一个项目需要维护呢肯定是有的依赖最新的 Python 3.14有的则必须跑在 Python 3.8 甚至古老的 Python 2.7 上维护遗留系统。系统自带的 Python 环境一旦弄乱修复起来就头大了。那这时候我们就要请上 ServBay 了。ServBay 为开发者提供了一个隔离且纯净的开发环境。它最大的优势是一键部署和多版本共存。极速安装还在用命令行就out了。ServBay 点击即可安装好包含常用组件的开发环境。全版本支持它支持从最新的 Python 3.x 到早期的 Python 2.x 版本。环境隔离ServBay 的环境独立于系统不会污染系统自带的 Python保证了系统的稳定性。对于追求效率的开发者而言将环境管理交给 ServBay把精力集中在代码和数据逻辑上才是更明智的选择。数据处理的边界正在被这些新兴的工具不断拓展。对于开发者而言保持对新技术的敏感度同时拥有一个随时能推倒重来且互不干扰的好工具也是提高效率的关键。