Created
May 15, 2025 13:45
-
-
Save mwcraig/52c4e2191a253d755526a2e16257673e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"id": "9dcf0b1c-3add-4a35-8b1b-f62ebedc36c8", | |
"metadata": {}, | |
"source": [ | |
"# Quick timing of converting a table of positions and radii to a lit of markers" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"id": "c8d12d26-0032-4873-97c3-5cf84ba6fe1c", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from astropy.table import Table\n", | |
"from matplotlib import pyplot as plt\n", | |
"from regions import CirclePixelRegion, PixCoord\n", | |
"import numpy as np\n", | |
"\n", | |
"rng = np.random.default_rng()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "73ba4c0c-fa3b-4757-8a30-de3f825537be", | |
"metadata": {}, | |
"source": [ | |
"## Define function to do the conversion" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"id": "fd41f570-e277-48aa-ba7f-25770ffa0fe0", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def table_to_regions(table):\n", | |
" regions = []\n", | |
" pcs = PixCoord(table[\"x\"], table[\"y\"])\n", | |
" for pc, radius in zip(pcs, table[\"radius\"]):\n", | |
" regions.append(CirclePixelRegion(pc, radius))\n", | |
" return regions" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "1dd27ba5-f387-4b5b-85ed-6cb32d5bb94e", | |
"metadata": {}, | |
"source": [ | |
"## Time the conversion" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"id": "71540bab-b6c8-4980-8772-25b2176dab9b", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"With 1000 rows conversion to regions took 2.73 ms ± 10.8 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n", | |
"With 10000 rows conversion to regions took 28.5 ms ± 362 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", | |
"With 100000 rows conversion to regions took 294 ms ± 6.44 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", | |
"With 1000000 rows conversion to regions took 2.91 s ± 11.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", | |
"With 10000000 rows conversion to regions took 30.3 s ± 440 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" | |
] | |
} | |
], | |
"source": [ | |
"timings = []\n", | |
"markers_to_time = [1_000, 10_000, 100_000, 1_000_000, 10_000_000]\n", | |
"for n_markers in markers_to_time:\n", | |
" x = rng.uniform(low=0.0, high=1000.0, size=n_markers)\n", | |
" y = rng.uniform(low=0.0, high=1000.0, size=n_markers)\n", | |
" tab = Table({\"x\": x, \"y\": y})\n", | |
" tab[\"radius\"] = rng.uniform(5, 15, size=n_markers)\n", | |
" %timeit -q -v time table_to_regions(tab)\n", | |
" print(f\"With {n_markers} rows conversion to regions took {time}\")\n", | |
" timings.append(time)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 52, | |
"id": "6b87598e-3ea0-442b-b497-575157c2e79f", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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", | |
"text/plain": [ | |
"<Figure size 640x480 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.figure()\n", | |
"avg_time = [time.average for time in timings]\n", | |
"plt.plot(markers_to_time, avg_time, \"x\", label=\"measured times\")\n", | |
"a_poly = np.polynomial.Polynomial.fit(np.log10(markers_to_time), np.log10(avg_time), 1)\n", | |
"\n", | |
"plt.plot(markers_to_time, 10**a_poly(np.log10(markers_to_time)), \n", | |
" label=\"fit $T_{run} = \" + f\"{10**a_poly(0) * 1e6:.3g}\" + r\"\\left(\\frac{N}{10^6}\\right)^{\" + f\"{a_poly.deriv()(0):.3f}\" + \"}$\")\n", | |
"plt.loglog()\n", | |
"plt.legend()\n", | |
"plt.xlabel(\"Number of rows in table\")\n", | |
"plt.ylabel(\"Average executioun time (sec)\")\n", | |
"plt.grid()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "17c6e08a-cab4-41d5-a3bf-03fbf9396ba0", | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3 (ipykernel)", | |
"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.13.3" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment