为何polars.scan_csv的速度甚至超过磁盘读取速度?
你的测试结果是Polars多个核心优化特性共同作用的产物,具体原因拆解如下:
谓词下推(Predicate Pushdown):
scan_csv属于懒执行API,Polars不会预先加载整个1.51GB的CSV文件到内存,而是在文件读取阶段就直接应用filter条件。它只会解析并读取ts列的数据,且只保留符合ts == '2015-01-01'的行对应的内容,实际磁盘IO量远小于文件总大小。列导向读取:CSV是行存储格式,但Polars扫描时会按列解析处理。你的需求仅涉及
ts列,因此其他列完全不会被读取和解析,直接砍掉了大部分不必要的IO与计算开销。操作系统磁盘缓存:如果该CSV文件此前被读取过,操作系统会将常用的文件块缓存到内存中。即使是HDD,读取缓存内的数据速度也接近内存读写速度(远高于HDD原生100-200MB/s的顺序读取速度)。若你的测试是在文件已被缓存的情况下运行,会直接拉高整体操作速度。
矢量化字符串处理:Polars对字符串类型做了深度优化,比较
ts列与目标字符串时采用矢量化批量操作,完全规避Python层面的循环开销,过滤计算的效率极高,不会成为流程瓶颈。查询优化器自动重写:Polars的查询优化器会自动调整执行逻辑,将过滤操作尽可能前置到读取阶段,避免冗余的数据加载与转换步骤。整个流程先解析
ts列、过滤符合条件的行,再将结果转换为Pandas DataFrame,没有多余环节。
本质上你看到的“750MB/s”并非读取整个文件的速度,而是Polars在仅读取必要数据、利用缓存和高效计算的前提下,完成查询的等效速度。实际磁盘IO量远小于1.51GB,再加上缓存与矢量化计算的加持,才会出现这种看似“超越磁盘速度”的结果。
内容的提问来源于stack exchange,提问作者lauhoman

