Skip to content

Instantly share code, notes, and snippets.

@kmsquire
Created March 7, 2015 03:14
Show Gist options
  • Save kmsquire/ca9886160829eaa5832d to your computer and use it in GitHub Desktop.
Save kmsquire/ca9886160829eaa5832d to your computer and use it in GitHub Desktop.
select vs select vs nsmallest in Julia
julia> include("test_select.jl")
sz = 10, n = 5:
select : mean: 0.00000065 median 0.00000058
select! : mean: 0.00000043 median 0.00000040
nsmallest: mean: 0.00000112 median 0.00000104
sz = 100, n = 5:
select : mean: 0.00000154 median 0.00000133
select! : mean: 0.00000071 median 0.00000068
nsmallest: mean: 0.00000232 median 0.00000219
sz = 100, n = 50:
select : mean: 0.00000270 median 0.00000258
select! : mean: 0.00000161 median 0.00000140
nsmallest: mean: 0.00000962 median 0.00000902
sz = 1000, n = 5:
select : mean: 0.00001061 median 0.00000778
select! : mean: 0.00000442 median 0.00000408
nsmallest: mean: 0.00000562 median 0.00000519
sz = 1000, n = 50:
select : mean: 0.00001140 median 0.00000928
select! : mean: 0.00000534 median 0.00000524
nsmallest: mean: 0.00002582 median 0.00002498
sz = 1000, n = 500:
select : mean: 0.00002625 median 0.00002485
select! : mean: 0.00002040 median 0.00001934
nsmallest: mean: 0.00012084 median 0.00010682
sz = 10000, n = 5:
select : mean: 0.00008258 median 0.00005986
select! : mean: 0.00004765 median 0.00005017
nsmallest: mean: 0.00001785 median 0.00001747
sz = 10000, n = 50:
select : mean: 0.00010093 median 0.00006327
select! : mean: 0.00005606 median 0.00005195
nsmallest: mean: 0.00005383 median 0.00005039
sz = 10000, n = 500:
select : mean: 0.00008543 median 0.00008394
select! : mean: 0.00007592 median 0.00007553
nsmallest: mean: 0.00032306 median 0.00027703
sz = 10000, n = 5000:
select : mean: 0.00033133 median 0.00028668
select! : mean: 0.00029830 median 0.00028135
nsmallest: mean: 0.00137905 median 0.00122354
sz = 100000, n = 5:
select : mean: 0.00079156 median 0.00083955
select! : mean: 0.00055755 median 0.00060999
nsmallest: mean: 0.00013899 median 0.00013791
sz = 100000, n = 50:
select : mean: 0.00085652 median 0.00075379
select! : mean: 0.00054414 median 0.00059557
nsmallest: mean: 0.00018883 median 0.00018461
sz = 100000, n = 500:
select : mean: 0.00091245 median 0.00084479
select! : mean: 0.00057836 median 0.00051428
nsmallest: mean: 0.00057491 median 0.00054534
sz = 100000, n = 5000:
select : mean: 0.00093798 median 0.00069805
select! : mean: 0.00065583 median 0.00064509
nsmallest: mean: 0.00313060 median 0.00306621
using DataStructures
times_select = DefaultDict((Int,Int), Vector{Float64}, ()->Float64[])
times_select! = DefaultDict((Int,Int), Vector{Float64}, ()->Float64[])
times_nsmallest = DefaultDict((Int,Int), Vector{Float64}, ()->Float64[])
# warmup
select([1,2,3,4,5], 1:3)
nsmallest(3, [1,2,3,4,5])
for sz in [10, 100, 1000, 10000, 100000]
for n in [5, 50, 500, 5000]
n > sz && continue
for iters = 1:div(1000000, sz)
c = rand(-sz:sz, sz)
c2 = copy(c)
t_select = @elapsed select(c, 1:n) # copies c
t_select! = @elapsed select!(c, 1:n) # modifies c
t_nsmallest = @elapsed nsmallest(n, c2)
push!(times_select[(sz, n)], t_select)
push!(times_select![(sz, n)], t_select!)
push!(times_nsmallest[(sz, n)], t_nsmallest)
end
times_select_sz_n = times_select[(sz, n)]
times_select!_sz_n = times_select![(sz, n)]
times_nsmallest_sz_n = times_nsmallest[(sz, n)]
@printf("sz = %6d, n = %4d:\n", sz, n)
@printf(" select : mean: %010.8f median %010.8f\n", mean(times_select_sz_n), median(times_select_sz_n))
@printf(" select! : mean: %010.8f median %010.8f\n", mean(times_select!_sz_n), median(times_select!_sz_n))
@printf(" nsmallest: mean: %010.8f median %010.8f\n", mean(times_nsmallest_sz_n), median(times_nsmallest_sz_n))
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment