Let’s compare several ways of making Histograms. I’m going to assume you would
like to end up with a nice OO histogram interface, so all the 2D methods will
fill a Physt histogram. We will be using a 2 x 1,000,000 element array and
filling a 2D histogram, or 10,000,000 elemends in a 1D histogram. Binnings are
regular.
1D 10,000,000 item histogram
| Example | KNL | MBP | X24 |
|---|
| NumPy: histogram | 704 ms | 147 ms | 114 ms |
| NumPy: bincount | 432 ms | 110 ms | 117 ms |
| fast-histogram | 337 ms | 45.9 ms | 45.7 ms |
| Numba | 312 ms | 58.8 ms | 60.7 ms |
2D 1,000,000 item histogram
| Example | KNL | MBP | X24 |
|---|
| Physt | 1.21 s | 293 ms | 246 ms |
| NumPy: histogram2d | 456 ms | 114 ms | 88.3 ms |
| NumPy: add.at | 247 ms | 62.7 ms | 49.7 ms |
| NumPy: bincount | 81.7 ms | 23.3 ms | 20.3 ms |
| fast-histogram | 53.7 ms | 10.4 ms | 7.31 ms |
| fast-hist threaded 0.5 | (6) 62.5 ms | 9.78 ms | (6) 15.4 ms |
| fast-hist threaded (m) | 62.3 ms | 4.89 ms | 3.71 ms |
| Numba | 41.8 ms | 10.2 ms | 9.73 ms |
| Numba threaded | (6) 49.2 ms | 4.23 ms | (6) 4.12 ms |
| Cython | 112 ms | 12.2 ms | 11.2 ms |
| Cython threaded | (6) 128 ms | 5.68 ms | (8) 4.89 ms |
| pybind11 sequential | 93.9 ms | 9.20 ms | 17.8 ms |
| pybind11 OpenMP atomic | 4.06 ms | 6.87 ms | 1.91 ms |
| pybind11 C++11 atomic | (32) 10.7 ms | 7.08 ms | (48) 2.65 ms |
| pybind11 C++11 merge | (32) 23.0 ms | 6.03 ms | (48) 4.79 ms |
| pybind11 OpenMP merge | 8.74 ms | 5.04 ms | 1.79 ms |
[Read More]