Skip to content

Instantly share code, notes, and snippets.

@cscherrer
Created September 1, 2019 18:14
Show Gist options
  • Select an option

  • Save cscherrer/0778e21a2e27d4e54e9bce2d89a8cbcb to your computer and use it in GitHub Desktop.

Select an option

Save cscherrer/0778e21a2e27d4e54e9bce2d89a8cbcb to your computer and use it in GitHub Desktop.
using Transducers
T = Transducers
struct MeanVar <: Transducer
end
function T.start(rf::T.R_{MeanVar}, result)
private_state = (0, 0.0, 0.0)
return T.wrap(rf, private_state, T.start(T.inner(rf), result))
end
function T.next(rf::T.R_{MeanVar}, result, input)
T.wrapping(rf, result) do st, iresult
(n, μ, M2) = st
n += 1
δ = input - μ
μ += δ/n
δ2 = input - μ
M2 += δ*δ2
iinput = (μ, M2 / (n-1))
iresult = T.next(T.inner(rf), iresult, iinput)
return (n,μ, M2), iresult
end
end
function T.complete(rf::T.R_{MeanVar}, result)
_private_state, inner_result = T.unwrap(rf, result)
return T.complete(T.inner(rf), inner_result)
end
collect(MeanVar(),randn(10))
using BenchmarkTools
@btime foldl(right, MeanVar(), 1:100)
using StatsBase
@btime mean_and_var(1:100)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment