Make AsBytes a convenience wrapper around ToBytes 💬 by Caio 4 years ago (log)

> BenchmarkAsBytes-4  90274	    13426 ns/op	   1952 B/op	    210 allocs/op


> BenchmarkAsBytes-4  877605	     1348 ns/op	   1536 B/op	      1 allocs/op



A fast map-reduce and parallel streaming friendly data-structure for accurate quantile approximation.

This package provides an implementation of Ted Dunning's t-digest data structure in Go.

GoDoc Go Report Card

Project Status

This project is actively maintained. We are happy to collaborate on features and issues if/when they arrive.


Our releases are tagged and signed following the Semantic Versioning scheme. If you are using a dependency manager such as dep, the recommended way to is go about your business normally:

go get

Otherwise we recommend to use the following so that you don't risk breaking your build because of an API change:

go get

Example Usage

package main

import (


func main() {
	// Analogue to tdigest.New(tdigest.Compression(100))
	t, _ := tdigest.New()

	for i := 0; i < 10000; i++ {
		// Analogue to t.AddWeighted(rand.Float64(), 1)

	fmt.Printf("p(.5) = %.6f\n", t.Quantile(0.5))
	fmt.Printf("CDF(Quantile(.5)) = %.6f\n", t.CDF(t.Quantile(0.5)))


You can configure your digest upon creation with options documented at options.go. Example:

// Construct a digest with compression=200 and its own
// (thread-unsafe) RNG seeded with 0xCA10:
digest, _ := tdigest.New(

Porting Existing Code to the v2 API

It's very easy to migrate to the new API:


This is a port of the reference implementation with some ideas borrowed from the python version. If you wanna get a quick grasp of how it works and why it's useful, this video and companion article is pretty helpful.