Julia中DataFrames的最快连接方法是什么?
Julia中更快的DataFrame连接方式
针对你测试的键完全有序且无重复的场景,有几种比默认innerjoin/leftjoin更快的方案:
1. 启用有序键的Merge连接算法
DataFrames.jl的join系列函数默认使用哈希连接(algorithm=:hash),但当连接键已严格有序时,指定algorithm=:merge能大幅降低耗时——这种算法的时间复杂度为O(n),比哈希连接的O(n log n)更高效:
using DataFrames, BenchmarkTools @btime join(df1, df2, on=:x, kind=:inner, algorithm=:merge) @btime join(df1, df2, on=:x, kind=:left, algorithm=:merge)
2. 直接拼接列(仅适用于键完全一一对应场景)
如果两个DataFrame的连接键是完全对齐的(比如测试中x均为1:n),无需执行任何连接匹配逻辑,直接合并列即可,这是理论上最快的方式:
# 方式1:构造新DataFrame @btime DataFrame(x=df1.x, y1=df1.y1, y2=df2.y2) # 方式2:原地添加列(内存效率最高) @btime transform!(df1, :y2 => (_->df2.y2) => :y2) # 方式3:横向合并 @btime hcat(df1, select(df2, :y2))
这类操作本质是内存复制,耗时通常仅几毫秒,远低于常规连接。
3. 使用Polars.jl实现高速连接
Polars是基于Rust的DataFrame库,其连接引擎针对多核并行和内存效率做了深度优化,在处理大型数据集时性能优势明显:
using Polars # 转换为Polars DataFrame pl_df1 = Polars.DataFrame(df1) pl_df2 = Polars.DataFrame(df2) @btime inner_join(pl_df1, pl_df2, on=:x) @btime left_join(pl_df1, pl_df2, on=:x)
4. 原地连接减少内存开销
默认连接会创建新的DataFrame,若无需保留原数据,可使用merge!执行原地连接,减少内存分配间接提升速度:
@btime merge!(df1, df2, on=:x) # 原地执行inner join,会修改df1
内容的提问来源于stack exchange,提问作者Quinten
相关产品推荐
相关产品推荐

