Depending on the context, using a lighter weight table seems to outperform DataFrames when including the cost to construct the table:
Setup
const s=repeat(1:10^6, inner=4)
const t=repeat(1:4, 10^6)
const r=rand(4*10^6)
using DataFrames
const df = DataFrame(;s,t,r)
function df_trial(s,t,r)
df = DataFrame(;s,t,r)
combine(groupby(df, :r), :s=>maximum)
end
using TypedTables
const tbl = Table(s=s,t=t,r=r)
function inner_loop!(group_maxima, s, r)
for i in eachindex(s)
@inbounds k = s[i]
@inbounds group_maxima[k] = max(get(group_maxima, k, -Inf), r[i])
end
end
# This is the same as @johnmyleswhite, but uses TypedTables instead
function custom_maximum(df)
s, r = df.s, df.r
group_maxima = Dict{eltype(s), Float64}()
inner_loop!(group_maxima, s, r)
Table(
s = collect(keys(group_maxima)),
r_maximum = collect(values(group_maxima)),
)
end
function tbl_trial(s,t,r)
tbl = Table(s=s,t=t,r=r)
custom_maximum(tbl)
end
tbl_trial(s,t,r)
df_trial(s,t,r)
combine(groupby(df, :s), :r=>maximum)
custom_maximum(tbl)
# create and group a dataframe
julia> @benchmark df_trial($s,$t,$r)
BenchmarkTools.Trial: 24 samples with 1 evaluation.
Range (min โฆ max): 201.259 ms โฆ 234.272 ms โ GC (min โฆ max): 4.96% โฆ 9.57%
Time (median): 217.930 ms โ GC (median): 8.59%
Time (mean ยฑ ฯ): 215.847 ms ยฑ 10.645 ms โ GC (mean ยฑ ฯ): 7.98% ยฑ 2.94%
โ โ โ โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
201 ms Histogram: frequency by time 234 ms <
Memory estimate: 311.97 MiB, allocs estimate: 308.
# create and group a typedtable
julia> @benchmark tbl_trial($s,$t,$r)
BenchmarkTools.Trial: 34 samples with 1 evaluation.
Range (min โฆ max): 140.362 ms โฆ 165.967 ms โ GC (min โฆ max): 0.00% โฆ 5.27%
Time (median): 151.275 ms โ GC (median): 3.38%
Time (mean ยฑ ฯ): 151.464 ms ยฑ 5.304 ms โ GC (mean ยฑ ฯ): 2.77% ยฑ 1.79%
โ โ โ โโ โโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
140 ms Histogram: frequency by time 166 ms <
Memory estimate: 80.43 MiB, allocs estimate: 58.
# just group an existing DataFrame
julia> @benchmark combine(groupby($df, :s), :r=>maximum)
BenchmarkTools.Trial: 157 samples with 1 evaluation.
Range (min โฆ max): 27.072 ms โฆ 41.158 ms โ GC (min โฆ max): 0.00% โฆ 22.72%
Time (median): 30.126 ms โ GC (median): 0.00%
Time (mean ยฑ ฯ): 32.019 ms ยฑ 3.704 ms โ GC (mean ยฑ ฯ): 8.71% ยฑ 9.68%
โโโโโโ โโ โ โ
โโโ
โโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโ
โโ
โโโโโโ
โโ
โโโโโโโโโโโโโโโโโ โ
27.1 ms Histogram: frequency by time 40.6 ms <
Memory estimate: 55.33 MiB, allocs estimate: 327.
# Just group an existing Table
julia> @benchmark custom_maximum($tbl)
BenchmarkTools.Trial: 34 samples with 1 evaluation.
Range (min โฆ max): 142.760 ms โฆ 172.040 ms โ GC (min โฆ max): 0.00% โฆ 2.32%
Time (median): 150.780 ms โ GC (median): 3.56%
Time (mean ยฑ ฯ): 151.268 ms ยฑ 5.719 ms โ GC (mean ยฑ ฯ): 2.94% ยฑ 1.97%
โ โ
โ
โโโ
โโ
โ
โ
โ
โ
โโ
โ
โ
โโ
โ
โโ
โ
โโโโโโ
โ
โโโโ
โโโ
โโ
โโโโโโโโโโโโโโโโโโโโโโโโโ
โ
143 ms Histogram: frequency by time 172 ms <
Memory estimate: 80.43 MiB, allocs estimate: 58.