{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
".benchmarks/Darwin-CPython-3.11-64bit/0003_a7f9e06fd44a98dc1caf03c110caf57e8dbf69c3_20231221_103807_uncommited-changes.json\n",
"benchmark results\n",
" 2023-12-21T10:48:12.673733\n",
" Intel(R) Core(TM) i7-8569U CPU @ 2.80GHz\n",
"\n",
"UnbinnedNLL\n",
"UnbinnedNLL_log\n",
"nll_numba_stats\n",
"nll_scipy.stats\n",
"nll_numba\n",
"minuit\n",
"minuit_numba\n",
"minuit_log\n",
"minuit_log_numba\n",
"minuit_parallel_fastmath\n",
"minuit_parallel_fastmath_log\n",
"minuit_cfunc\n",
"minuit_UnbinnedNLL\n",
"minuit_UnbinnedNLL_log\n",
"RooFit_legacy\n",
"RooFit_legacy-parallel\n",
"RooFit_cpu\n",
"RooFit_cpu-parallel\n",
"RooFit_cpu-implicitmt\n",
"RooFit_codegen\n",
"RooFit_codegen_no_grad\n"
]
},
{
"data": {
"image/svg+xml": [
"\n",
"\n",
"\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/svg+xml": [
"\n",
"\n",
"\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/svg+xml": [
"\n",
"\n",
"\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%config InlineBackend.figure_formats = ['svg']\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import json\n",
"\n",
"from pathlib import Path\n",
"\n",
"with open(\"root.json\") as f:\n",
" root_data = json.load(f)\n",
"\n",
"paths = []\n",
"for p in Path(\".benchmarks\").rglob(\"*.json\"):\n",
" paths.append((p.stat().st_mtime, p))\n",
"paths.sort()\n",
"fn = paths[-1][1]\n",
"\n",
"print(fn)\n",
"with open(fn) as f:\n",
" data = json.load(f)\n",
"\n",
"print(\n",
" f\"\"\"\\\n",
"benchmark results\n",
" {data['datetime']}\n",
" {data['machine_info']['cpu']['brand_raw']}\n",
"\"\"\"\n",
")\n",
"\n",
"variant = {}\n",
"for d in (data, root_data):\n",
" # override ROOT results with root_data if any\n",
" for k in tuple(variant):\n",
" if k.startswith(\"RooFit\"):\n",
" del variant[k]\n",
" for b in d[\"benchmarks\"]:\n",
" params = b[\"params\"]\n",
" n = params[\"n\"]\n",
" n = int(n)\n",
" name = b[\"name\"]\n",
" name = name[name.find(\"_\") + 1 : name.find(\"[\")]\n",
" extra = []\n",
" for k, v in params.items():\n",
" if k in (\"n\", \"lib\", \"model\"):\n",
" continue\n",
" if isinstance(v, (bool, int)):\n",
" if v:\n",
" extra.append(k)\n",
" else:\n",
" extra.append(v)\n",
" if extra:\n",
" name += \"_\" + \"_\".join(extra)\n",
" for key in (\"lib\", \"model\"):\n",
" if key in params:\n",
" name += f\"_{params[key]}\"\n",
" t = b[\"stats\"][\"min\"]\n",
" if name not in variant:\n",
" variant[name] = []\n",
" variant[name].append((n, t))\n",
"\n",
"for k in variant:\n",
" print(k)\n",
"\n",
"names = {\n",
" \"Numba vs. SciPy\": {\n",
" \"nll_scipy.stats\": \"handwritten NLL scipy.stats\",\n",
" \"nll_numba_stats\": \"handwritten NLL numba_stats\",\n",
" },\n",
" \"Overhead\": {\n",
" \"minuit_UnbinnedNLL\": \"iminuit+UnbinnedNLL\",\n",
" \"minuit_numba\": \"iminuit+numba\",\n",
" \"minuit_cfunc\": \"iminuit+numba.cfunc\",\n",
" },\n",
" \"RooFit vs. iminuit+numba\": {\n",
" \"RooFit_legacy\": \"RooFit [legacy]\",\n",
" \"RooFit_legacy-parallel\": \"RooFit [legacy, parallel]\",\n",
" \"RooFit_cpu\": \"RooFit [CPU]\",\n",
" \"RooFit_cpu-implicitmt\": \"RooFit [CPU, ImplicitMT]\",\n",
" # \"RooFit_cpu_NumCPU\": \"RooFit [CPU, parallel]\",\n",
" \"RooFit_codegen\": \"RooFit [Codegen]\",\n",
" \"RooFit_codegen_no_grad\": \"RooFit [CodegenNoGrad]\",\n",
" # \"RooFit_codegen_NumCPU\": \"RooFit [Codegen, parallel]\",\n",
" \"minuit\": \"iminuit+numba\",\n",
" \"minuit_parallel_fastmath\": \"iminuit+numba [parallel, fastmath]\",\n",
" \"minuit_parallel_fastmath_log\": \"iminuit+numba logpdf [parallel, fastmath]\",\n",
" },\n",
"}\n",
"\n",
"for title, subnames in names.items():\n",
" plt.figure(constrained_layout=True)\n",
" plt.title(title)\n",
" for name in subnames:\n",
" if name not in variant:\n",
" continue\n",
" d = variant[name]\n",
" n, t = np.transpose(d)\n",
" ls = \"-\"\n",
" if (\n",
" \"parallel\" in name\n",
" and \"fastmath\" in name\n",
" or (\"NumCPU\" in name and \"BatchMode\" in name)\n",
" ):\n",
" ls = \"-.\"\n",
" elif \"parallel\" in name or \"NumCPU\" in name:\n",
" ls = \"--\"\n",
" elif \"fastmath\" in name or \"BatchMode\" in name:\n",
" ls = \":\"\n",
" plt.plot(n, t, ls=ls, label=subnames[name])\n",
"\n",
" plt.loglog()\n",
" plt.legend(\n",
" frameon=False,\n",
" fontsize=\"medium\" if len(subnames) < 4 else \"small\",\n",
" ncol=1 if len(subnames) < 3 else 2,\n",
" )\n",
" # plt.title(\"Fit of normal distribution with 2 parameters\")\n",
" plt.xlabel(\"number of data points\")\n",
" plt.ylabel(\"runtime / sec\")\n",
" fname = title.replace(\" \", \"_\").replace(\".\", \"_\").replace(\"__\", \"_\").lower()\n",
" plt.savefig(f\"{fname}.svg\")"
]
}
],
"metadata": {
"keep_output": true,
"kernelspec": {
"display_name": "py39",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}