{ "cells": [ { "cell_type": "markdown", "id": "a8d15cee", "metadata": {}, "source": [ "# Benchmarking" ] }, { "cell_type": "code", "execution_count": 1, "id": "b7d64184", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import jax\n", "import jax.numpy as jnp\n", "import time\n", "import WDM" ] }, { "cell_type": "markdown", "id": "8a2ce23c", "metadata": {}, "source": [ "We will time some of the dwt methods on a time series of length $N=2^{16}=32768$." ] }, { "cell_type": "code", "execution_count": 2, "id": "d51fd3b4", "metadata": {}, "outputs": [], "source": [ "wdm = WDM.WDM.WDM_transform(dt=1., \n", " Nf=2**8, \n", " N=2**15)\n", "\n", "x = np.random.normal(size=wdm.N) # white noise" ] }, { "cell_type": "code", "execution_count": 3, "id": "f68fc199", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Time taken: 1369.47 milliseconds\n" ] } ], "source": [ "t0 = time.time()\n", "w = wdm.forward_transform_exact(x).block_until_ready()\n", "t1 = time.time()\n", "\n", "print(f\"Time taken: {(t1-t0)*1000:.2f} milliseconds\")" ] }, { "cell_type": "code", "execution_count": 4, "id": "436a751a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Time taken: 94.96 milliseconds\n" ] } ], "source": [ "t0 = time.time()\n", "w = wdm.forward_transform_short_fft(x).block_until_ready()\n", "t1 = time.time()\n", "\n", "print(f\"Time taken: {(t1-t0)*1000:.2f} milliseconds\")" ] }, { "cell_type": "code", "execution_count": 5, "id": "19864f32", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Time taken: 44.54 milliseconds\n" ] } ], "source": [ "t0 = time.time()\n", "w = wdm.forward_transform_fft(x).block_until_ready()\n", "t1 = time.time()\n", "\n", "print(f\"Time taken: {(t1-t0)*1000:.2f} milliseconds\")" ] }, { "cell_type": "markdown", "id": "e5a13939", "metadata": {}, "source": [ "Compilation means subsequent calls can be much faster." ] }, { "cell_type": "code", "execution_count": 6, "id": "9d207ee1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Time taken: 21.80 milliseconds\n", "Time taken: 0.92 milliseconds\n" ] } ], "source": [ "t0 = time.time()\n", "w = wdm.dwt(x).block_until_ready()\n", "t1 = time.time()\n", "\n", "print(f\"Time taken: {(t1-t0)*1000:.2f} milliseconds\")\n", "\n", "t0 = time.time()\n", "w = wdm.dwt(x).block_until_ready()\n", "t1 = time.time()\n", "\n", "print(f\"Time taken: {(t1-t0)*1000:.2f} milliseconds\")" ] }, { "cell_type": "markdown", "id": "9a77c473", "metadata": {}, "source": [ "Vectorisation means that batched transforms can also be much faster." ] }, { "cell_type": "code", "execution_count": 7, "id": "c26fe209", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Time taken: 66.06 milliseconds\n", "Time taken: 8.31 milliseconds\n" ] } ], "source": [ "x = np.random.normal(size=(20, wdm.N)) # white noise\n", "\n", "t0 = time.time()\n", "w = wdm.dwt(x).block_until_ready()\n", "t1 = time.time()\n", "\n", "print(f\"Time taken: {(t1-t0)*1000:.2f} milliseconds\")\n", "\n", "t0 = time.time()\n", "w = wdm.dwt(x).block_until_ready()\n", "t1 = time.time()\n", "\n", "print(f\"Time taken: {(t1-t0)*1000:.2f} milliseconds\")" ] }, { "cell_type": "markdown", "id": "1b302ca9", "metadata": {}, "source": [ "Let's compare this with the cost of an FFT on the same set of time series." ] }, { "cell_type": "code", "execution_count": 8, "id": "b0510401", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Time taken: 41.41 milliseconds\n", "Time taken: 11.78 milliseconds\n" ] } ], "source": [ "t0 = time.time()\n", "w = jnp.fft.fft(x).block_until_ready()\n", "t1 = time.time()\n", "\n", "print(f\"Time taken: {(t1-t0)*1000:.2f} milliseconds\")\n", "\n", "t0 = time.time()\n", "w = jnp.fft.fft(x).block_until_ready()\n", "t1 = time.time()\n", "\n", "print(f\"Time taken: {(t1-t0)*1000:.2f} milliseconds\")" ] }, { "cell_type": "markdown", "id": "661a5fd7", "metadata": {}, "source": [ "Let's also time the inverse transform." ] }, { "cell_type": "code", "execution_count": 9, "id": "c41f80f1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Time taken: 1057.09 milliseconds\n" ] } ], "source": [ "x = np.random.normal(size=wdm.N) # white noise\n", "\n", "w = wdm.dwt(x)\n", "\n", "t0 = time.time()\n", "x_recovered = wdm.idwt(w).block_until_ready()\n", "t1 = time.time()\n", "\n", "print(f\"Time taken: {(t1-t0)*1000:.2f} milliseconds\")" ] }, { "cell_type": "markdown", "id": "a3ee2f57", "metadata": {}, "source": [ "The inverse transforms are also vectorised." ] }, { "cell_type": "code", "execution_count": 10, "id": "9c121db7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Time taken: 5842.13 milliseconds\n" ] } ], "source": [ "x = np.random.normal(size=(20, wdm.N)) # white noise\n", "\n", "w = wdm.dwt(x)\n", "\n", "t0 = time.time()\n", "x_recovered = wdm.idwt(w).block_until_ready()\n", "t1 = time.time()\n", "\n", "print(f\"Time taken: {(t1-t0)*1000:.2f} milliseconds\")" ] }, { "cell_type": "code", "execution_count": null, "id": "c15d93fa", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "WDM", "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.5" } }, "nbformat": 4, "nbformat_minor": 5 }