Skip to content

Instantly share code, notes, and snippets.

@jaimefrio
Created January 31, 2014 21:44
Show Gist options
  • Save jaimefrio/8743836 to your computer and use it in GitHub Desktop.
Save jaimefrio/8743836 to your computer and use it in GitHub Desktop.
`np.bincount` benchmarking
-------------+---------+-----------------+-----------------
bins len | old | new (naive) | new (opt.)
-------------+---------+-----------------+-----------------
3 3 | 8.2e-07 | 8.2e-07 (1.00x) | 8.2e-07 (1.00x)
3 10 | 8.2e-07 | 8.2e-07 (1.00x) | 8.2e-07 (1.00x)
3 30 | 8.2e-07 | 8.2e-07 (1.00x) | 8.2e-07 (1.00x)
3 100 | 9.8e-07 | 8.3e-07 (1.18x) | 8.2e-07 (1.20x)
3 300 | 1.6e-06 | 1.2e-06 (1.33x) | 1.2e-06 (1.33x)
3 1000 | 3.0e-06 | 2.5e-06 (1.20x) | 2.5e-06 (1.20x)
3 3000 | 7.3e-06 | 6.3e-06 (1.16x) | 7.9e-06 (0.92x)
3 10000 | 2.3e-05 | 1.9e-05 (1.21x) | 2.7e-05 (0.85x)
3 30000 | 6.6e-05 | 5.6e-05 (1.18x) | 8.3e-05 (0.80x)
3 100000 | 2.2e-04 | 1.9e-04 (1.16x) | 2.8e-04 (0.79x)
10 3 | 8.2e-07 | 8.2e-07 (1.00x) | 8.2e-07 (1.00x)
10 10 | 8.3e-07 | 8.2e-07 (1.01x) | 8.2e-07 (1.01x)
10 30 | 8.2e-07 | 8.2e-07 (1.00x) | 8.2e-07 (1.00x)
10 100 | 1.2e-06 | 8.3e-07 (1.45x) | 8.2e-07 (1.46x)
10 300 | 1.3e-06 | 1.2e-06 (1.08x) | 1.2e-06 (1.08x)
10 1000 | 2.9e-06 | 2.5e-06 (1.16x) | 2.5e-06 (1.16x)
10 3000 | 7.0e-06 | 5.8e-06 (1.21x) | 8.3e-06 (0.84x)
10 10000 | 2.1e-05 | 1.8e-05 (1.17x) | 2.9e-05 (0.72x)
10 30000 | 6.2e-05 | 5.2e-05 (1.19x) | 8.9e-05 (0.70x)
10 100000 | 2.1e-04 | 1.7e-04 (1.24x) | 3.0e-04 (0.70x)
30 3 | 8.2e-07 | 8.2e-07 (1.00x) | 8.2e-07 (1.00x)
30 10 | 8.2e-07 | 8.2e-07 (1.00x) | 8.2e-07 (1.00x)
30 30 | 8.2e-07 | 8.2e-07 (1.00x) | 8.2e-07 (1.00x)
30 100 | 1.2e-06 | 8.4e-07 (1.43x) | 8.2e-07 (1.46x)
30 300 | 1.5e-06 | 1.2e-06 (1.25x) | 1.2e-06 (1.25x)
30 1000 | 2.9e-06 | 2.5e-06 (1.16x) | 2.5e-06 (1.16x)
30 3000 | 6.8e-06 | 5.9e-06 (1.15x) | 8.3e-06 (0.82x)
30 10000 | 2.1e-05 | 1.8e-05 (1.17x) | 2.9e-05 (0.72x)
30 30000 | 6.3e-05 | 5.2e-05 (1.21x) | 9.1e-05 (0.69x)
30 100000 | 2.1e-04 | 1.7e-04 (1.24x) | 3.0e-04 (0.70x)
100 3 | 8.2e-07 | 8.2e-07 (1.00x) | 8.2e-07 (1.00x)
100 10 | 8.2e-07 | 8.2e-07 (1.00x) | 8.2e-07 (1.00x)
100 30 | 8.2e-07 | 8.2e-07 (1.00x) | 8.2e-07 (1.00x)
100 100 | 1.2e-06 | 8.9e-07 (1.35x) | 8.2e-07 (1.46x)
100 300 | 1.6e-06 | 1.2e-06 (1.33x) | 1.3e-06 (1.23x)
100 1000 | 2.9e-06 | 2.5e-06 (1.16x) | 2.6e-06 (1.12x)
100 3000 | 6.8e-06 | 5.9e-06 (1.15x) | 8.2e-06 (0.83x)
100 10000 | 2.1e-05 | 1.8e-05 (1.17x) | 3.0e-05 (0.70x)
100 30000 | 6.2e-05 | 5.3e-05 (1.17x) | 9.0e-05 (0.69x)
100 100000 | 2.1e-04 | 1.8e-04 (1.17x) | 3.1e-04 (0.68x)
300 3 | 8.2e-07 | 8.2e-07 (1.00x) | 8.2e-07 (1.00x)
300 10 | 8.3e-07 | 8.3e-07 (1.00x) | 8.3e-07 (1.00x)
300 30 | 8.4e-07 | 8.4e-07 (1.00x) | 8.3e-07 (1.01x)
300 100 | 1.2e-06 | 9.6e-07 (1.25x) | 8.6e-07 (1.40x)
300 300 | 1.7e-06 | 1.2e-06 (1.42x) | 1.2e-06 (1.42x)
300 1000 | 2.9e-06 | 2.5e-06 (1.16x) | 2.5e-06 (1.16x)
300 3000 | 7.1e-06 | 5.9e-06 (1.20x) | 8.2e-06 (0.87x)
300 10000 | 2.1e-05 | 1.8e-05 (1.17x) | 2.9e-05 (0.72x)
300 30000 | 6.1e-05 | 5.0e-05 (1.22x) | 8.9e-05 (0.69x)
300 100000 | 2.1e-04 | 1.7e-04 (1.24x) | 3.0e-04 (0.70x)
1000 3 | 8.3e-07 | 8.3e-07 (1.00x) | 8.3e-07 (1.00x)
1000 10 | 8.3e-07 | 8.3e-07 (1.00x) | 8.3e-07 (1.00x)
1000 30 | 1.0e-06 | 8.3e-07 (1.20x) | 8.3e-07 (1.20x)
1000 100 | 1.2e-06 | 1.2e-06 (1.00x) | 1.1e-06 (1.09x)
1000 300 | 1.6e-06 | 1.4e-06 (1.14x) | 1.2e-06 (1.33x)
1000 1000 | 3.1e-06 | 2.6e-06 (1.19x) | 2.6e-06 (1.19x)
1000 3000 | 6.9e-06 | 5.8e-06 (1.19x) | 8.2e-06 (0.84x)
1000 10000 | 2.1e-05 | 1.8e-05 (1.17x) | 2.9e-05 (0.72x)
1000 30000 | 6.3e-05 | 5.1e-05 (1.24x) | 8.8e-05 (0.72x)
1000 100000 | 2.0e-04 | 1.7e-04 (1.18x) | 3.0e-04 (0.67x)
3000 3 | 1.2e-06 | 1.1e-06 (1.09x) | 1.2e-06 (1.00x)
3000 10 | 1.2e-06 | 1.2e-06 (1.00x) | 1.2e-06 (1.00x)
3000 30 | 1.2e-06 | 1.3e-06 (0.92x) | 1.2e-06 (1.00x)
3000 100 | 1.6e-06 | 1.3e-06 (1.23x) | 1.2e-06 (1.33x)
3000 300 | 2.1e-06 | 1.7e-06 (1.24x) | 1.7e-06 (1.24x)
3000 1000 | 3.7e-06 | 2.9e-06 (1.28x) | 2.9e-06 (1.28x)
3000 3000 | 7.6e-06 | 6.2e-06 (1.23x) | 8.7e-06 (0.87x)
3000 10000 | 2.1e-05 | 1.8e-05 (1.17x) | 3.0e-05 (0.70x)
3000 30000 | 6.2e-05 | 5.1e-05 (1.22x) | 8.9e-05 (0.70x)
3000 100000 | 2.0e-04 | 1.7e-04 (1.18x) | 3.0e-04 (0.67x)
10000 3 | 2.2e-06 | 2.5e-06 (0.88x) | 2.5e-06 (0.88x)
10000 10 | 2.2e-06 | 2.6e-06 (0.85x) | 2.5e-06 (0.88x)
10000 30 | 2.5e-06 | 2.6e-06 (0.96x) | 2.5e-06 (1.00x)
10000 100 | 2.5e-06 | 2.8e-06 (0.89x) | 2.6e-06 (0.96x)
10000 300 | 3.1e-06 | 3.0e-06 (1.03x) | 3.1e-06 (1.00x)
10000 1000 | 8.7e-06 | 8.1e-06 (1.07x) | 1.0e-05 (0.87x)
10000 10000 | 2.3e-05 | 2.0e-05 (1.15x) | 3.2e-05 (0.72x)
10000 30000 | 6.4e-05 | 5.5e-05 (1.16x) | 9.3e-05 (0.69x)
10000 100000 | 2.1e-04 | 1.8e-04 (1.17x) | 3.1e-04 (0.68x)
-------------+---------+-----------------+-----------------
(*) Timings are averages of 100 runs of `np.bincount(x)` where
`x = np.random.randint(bins, size=len)`. The naive method
simply checks each item against the min and max in a single
loop of the array, while the optimized one takes items in
pairs, compares them to each other, then checks the smaller
against the min and the largest against the max, so it does
only 3 comparisons for every 2 items, instead of 3 per item.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment