From 99053f03ec71d9ec5e0911dbc2f39f5df3f08164 Mon Sep 17 00:00:00 2001 From: "Ashwin V. Mohanan" Date: Fri, 17 Jan 2025 14:36:15 +0100 Subject: [PATCH 1/8] Configure intersphinx --- Makefile | 9 +++++++++ content/conf.py | 26 +++++++++++++++++++++----- content/ls_intersphinx_targets.py | 9 +++++++++ 3 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 content/ls_intersphinx_targets.py diff --git a/Makefile b/Makefile index 46f35b9..7b1b39a 100644 --- a/Makefile +++ b/Makefile @@ -22,3 +22,12 @@ help: # Live reload site documents for local development livehtml: sphinx-autobuild "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +INTERSPHINX_TARGETS := \ + intersphinx-python \ + intersphinx-numpy \ + intersphinx-ipython + +.PHONY: $(INTERSPHINX_TARGETS) +$(INTERSPHINX_TARGETS): intersphinx-%: + cd content && python3 ls_intersphinx_targets.py $(subst intersphinx-,,$@) | less diff --git a/content/conf.py b/content/conf.py index 283ddf0..86a9452 100644 --- a/content/conf.py +++ b/content/conf.py @@ -37,6 +37,7 @@ # remove once sphinx_rtd_theme updated for contrast and accessibility: "sphinx_rtd_theme_ext_color_contrast", "sphinx.ext.todo", + "IPython.sphinxext.ipython_console_highlighting", ] # Settings for myst_nb: @@ -101,16 +102,31 @@ # :py:mod:`multiprocessing` to link straight to the Python docs of that module. # List all available references: # python -msphinx.ext.intersphinx https://docs.python.org/3/objects.inv -# extensions.append('sphinx.ext.intersphinx') -# intersphinx_mapping = { -# #'python': ('https://docs.python.org/3', None), +extensions.append('sphinx.ext.intersphinx') +intersphinx_mapping = { + 'python': ('https://docs.python.org/3', None), # #'sphinx': ('https://www.sphinx-doc.org/', None), -# #'numpy': ('https://numpy.org/doc/stable/', None), + 'numpy': ('https://numpy.org/doc/stable/', None), # #'scipy': ('https://docs.scipy.org/doc/scipy/reference/', None), # #'pandas': ('https://pandas.pydata.org/docs/', None), # #'matplotlib': ('https://matplotlib.org/', None), # 'seaborn': ('https://seaborn.pydata.org/', None), -# } + 'ipython': ('https://ipython.readthedocs.io/en/stable/', None), +} + +# sphinx-hoverxref +extensions.append("hoverxref.extension") +hoverxref_auto_ref = True +hoverxref_domains = ["py"] +hoverxref_role_types = { + 'hoverxref': 'modal', + 'ref': 'modal', # for hoverxref_auto_ref config + 'func': 'modal', + 'meth': 'modal', + 'mod': 'tooltip', # for Python Sphinx Domain + 'class': 'tooltip', # for Python Sphinx Domain +} + # add few new directives from sphinx_lesson.directives import _BaseCRDirective diff --git a/content/ls_intersphinx_targets.py b/content/ls_intersphinx_targets.py new file mode 100644 index 0000000..c222edc --- /dev/null +++ b/content/ls_intersphinx_targets.py @@ -0,0 +1,9 @@ +import sys +from sphinx.ext.intersphinx import inspect_main + +from conf import intersphinx_mapping + + +library = sys.argv[1] +url = intersphinx_mapping[library][0] + "/objects.inv" +inspect_main([url]) From 2af09b2006d390239a6271bc86d5f34397944a4b Mon Sep 17 00:00:00 2001 From: "Ashwin V. Mohanan" Date: Fri, 17 Jan 2025 15:02:35 +0100 Subject: [PATCH 2/8] Add benchmarking section with exercise --- content/index.rst | 4 +- content/optimization.rst | 139 ++++++++++++++++++++++++++++++++------- 2 files changed, 117 insertions(+), 26 deletions(-) diff --git a/content/index.rst b/content/index.rst index 807fe4f..5b34d99 100644 --- a/content/index.rst +++ b/content/index.rst @@ -139,8 +139,8 @@ Several examples and formulations are inspired by other open source educational - `Scipy Lecture Notes `__ - `Machine Learning and Data Science Notebooks `__ - `Elegant SciPy `__ -- `A Comprehensive Guide to NumPy Data Types `__ - +- `A Comprehensive Guide to NumPy Data Types `__ +- `Python performance workshop `__ Instructional Material ^^^^^^^^^^^^^^^^^^^^^^ diff --git a/content/optimization.rst b/content/optimization.rst index f09ced9..8815bea 100644 --- a/content/optimization.rst +++ b/content/optimization.rst @@ -1,8 +1,7 @@ .. _performance: - -Profiling and Optimizing -======================== +Benchmarking, profiling and optimizing +====================================== .. objectives:: @@ -15,59 +14,151 @@ Profiling and Optimizing - 30 min exercises -Once your code is working reliably, you can start thinking of optimizing it. -.. warning:: +.. keypoints:: - Always measure the code before you start optimization. Don't base your optimization - on theoretical consideration, otherwise you'll have surprises. + - Once your code is working reliably, you can start thinking of optimizing it. + - Always measure the code before you start optimization. Don't base your optimization + on assumptions, otherwise you'll have surprises. -Profilers ---------- +Benchmarking +------------ + +Benchmarking is a method of doing performance analysis for either the end-to-end execution of a whole +program or a part of a program. time ^^^^ -One of the easy way to profile the program is to use the time function: +One of the easy way to benchmark is to use the time function: .. code-block:: python + :emphasize-lines: 1, 8, 12-13 import time + + + def some_function(): + ... + # start the timer - start_time=time.time() - # here are the code you would like to profile - a = np.arange(1000) - a = a ** 2 - # stop the timer - end_time=time.time() + start_time = time.time() + # here are the code you would like to measure + result = some_function() + # stop the + end_time = time.time() print("Runtime: {:.4f} seconds".format(end_time - start_time)) - # Runtime: 0.0001 seconds -Timeit +The IPython "magic" command +:py:meth:`%time ` +can also be used to quickly print the same with less effort as follows: + +.. code-block:: ipython + + %time some_function() + + +timeit ^^^^^^ If you're using a Jupyter notebook, the best choice will be to use -`%timeit `__ to time a small piece of code: +:py:mod:`timeit` module or the +IPython "magic" command +:py:meth:`%timeit ` +to repeatedly time a small piece of code: .. code-block:: ipython + :emphasize-lines: 5 import numpy as np a = np.arange(1000) %timeit a ** 2 - # 1.4 µs ± 25.1 ns per loop -One can also use the cell magic ``%%timeit`` to benchmark a full cell. +We will shortly see in an +One can also use the cell magic +:py:meth:`%timeit ` +to benchmark a full cell containing a block of code. -.. note:: +.. exercise:: - For long running calls, using ``%time`` instead of ``%timeit``; it is - less precise but faster + Start with the following code:: + import numpy as np + + + a = np.arange(1000) + + def square_sum(array): + return (a ** 2).sum() + + #. Run ``%time square_sum(a)`` a couple of times. Do you get the same result? + #. Run ``%timeit square_sum(a)`` a couple of times. Do you get the same result? + + +.. solution:: + + 1. Run ``%time square_sum(a)`` a couple of times. + + .. code-block:: ipython + + In [1]: import numpy as np + ...: + ...: + ...: a = np.arange(1000) + ...: + ...: def square_sum(array): + ...: return (a ** 2).sum() + ...: + + In [2]: %time square_sum(a) + CPU times: user 184 μs, sys: 5 μs, total: 189 μs + Wall time: 155 μs + Out[2]: np.int64(332833500) + + In [3]: %time square_sum(a) + CPU times: user 74 μs, sys: 0 ns, total: 74 μs + Wall time: 77.7 μs + Out[3]: np.int64(332833500) + + We get a rough estimate of how long it takes to execute a function for a given + input value. While useful, a few sample timings of the function ``square_sum()``, + does not represent a reproducible benchmark. + Subsequent measurements can result in different runtimes, due to the state of the + computer such as: + + - what background processes are running, + - hyperthreading, + - memory and cache usage, + - CPU's temperature, + + and many more factors, also collectively known as *system jitter*. + + 2. Run ``%timeit square_sum(a)`` a couple of times. + + .. code-block:: ipython + + In [4]: %timeit square_sum(a) + 1.62 μs +/- 55.4 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) + + In [5]: %timeit square_sum(a) + 1.6 μs +/- 46.6 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) + + By making several measurements, we manage to reduce jitter and the measurement is more + reliable + + .. note:: + + For long running calls, using ``%time`` instead of ``%timeit``; it is + less precise but faster + + +Profiling +--------- cProfile ^^^^^^^^ From 9f5bd14094977724e4a132c9f9b097436a211bf5 Mon Sep 17 00:00:00 2001 From: "Ashwin V. Mohanan" Date: Mon, 20 Jan 2025 14:00:24 +0100 Subject: [PATCH 3/8] Distinguish det. and sampling profilers, add scalene to optional --- content/example/scalene_web.png | Bin 0 -> 176914 bytes content/index.rst | 3 +- content/optimization.rst | 93 ++++++++++++++++++++-- content/optimization_opt.rst | 132 ++++++++++++++++++++++++++++++++ 4 files changed, 221 insertions(+), 7 deletions(-) create mode 100644 content/example/scalene_web.png create mode 100644 content/optimization_opt.rst diff --git a/content/example/scalene_web.png b/content/example/scalene_web.png new file mode 100644 index 0000000000000000000000000000000000000000..ff71b3273119cdf44bebdc93ba7eebac104ec46f GIT binary patch literal 176914 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Ä#4cT|?0(JxqX1ox)8NGAIc!#^1 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 literal 0 HcmV?d00001 diff --git a/content/index.rst b/content/index.rst index 5b34d99..dc572f2 100644 --- a/content/index.rst +++ b/content/index.rst @@ -68,6 +68,7 @@ and distributed computing. pandas-extra GPU-computing parallel-computing_opt + optimization_opt .. toctree:: @@ -136,7 +137,7 @@ Several examples and formulations are inspired by other open source educational - `Python for Data Analysis `__ - `GTC2017-numba `__ - `IPython Cookbook `__ -- `Scipy Lecture Notes `__ +- `Scientific Python Lectures `__ (*previously known as, Scipy Lecture Notes*) - `Machine Learning and Data Science Notebooks `__ - `Elegant SciPy `__ - `A Comprehensive Guide to NumPy Data Types `__ diff --git a/content/optimization.rst b/content/optimization.rst index 8815bea..3f68164 100644 --- a/content/optimization.rst +++ b/content/optimization.rst @@ -159,13 +159,91 @@ to benchmark a full cell containing a block of code. Profiling --------- +Profilers are applications which attach to the execution of the program, which in our case is done +by the CPython interpreter and analyze the time taken for different portions of the code. +Profilers help to identify performance bottlenecks in the code by showing +- wall-time (*or start to end time that the user observes), +- CPU and GPU time, and +- memory usage patterns + +in **function/method/line of code** level granularity. + +Deterministic profilers vs. sampling profilers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. note:: + + *Deterministic profilers* are also called *tracing profilers*. + +**Deterministic profilers** record every function call and event in the program, +logging the exact sequence and duration of events. + + 👍 **Pros:** + - Provides detailed information on the program's execution. + - Deterministic: Captures exact call sequences and timings. + 👎 **Cons:** + - Higher overhead, slowing down the program. + - Can generate larger amount of data. + +**Sampling profilers** periodically samples the program's state (where it is +and how much memory is used), providing a statistical view of where time is +spent. + + 👍 **Pros:** + - Lower overhead, as it doesn't track every event. + - Scales better with larger programs. + + 👎 **Cons:** + - Less precise, potentially missing infrequent or short calls. + - Provides an approximation rather than exact timing. + + +.. discussion:: + + *Analogy*: Imagine we want to optimize the Stockholm Länstrafik (SL) metro system + We wish to detect bottlenecks in the system to improve the service and for this we have + asked few passengers to help us by tracking their journey. + + - **Deterministic**: + We follow every train and passenger, recording every stop + and delay. When passengers enter and exit the train, we record the exact time + and location. + - **Sampling**: + Every 5 minutes the phone notifies the passenger to note + down their current location. We then use this information to estimate + the most crowded stations and trains. + +In addition to the above distinctions, some profilers can also + +.. callout:: Examples of some profilers + :class: dropdown + + CPU profilers: + + - `cProfile and profile `__ + - `line_profiler `__ + - `py-spy `__ + + Memory profilers: + + - `tracemalloc `__ + - `memray `__ + + Both CPU and memory: + + - `Scalene `__ (see optional course material on :ref:`scalene`) + +In the following sections, we will use :ref:`cProfile` and :ref:`line-profiler` to profile a Python program. +cProfile is a deterministic (tracing) profiler built-in to the Python standard library +and gives timings in function-level granularity. +Line profiler is also deterministic and it provides timings in line-of-code granularity for few selected +functions. + +.. _cProfile: cProfile ^^^^^^^^ -For more complex code, one can use the `built-in python profilers -`_, ``cProfile`` or ``profile``. - As a demo, let us consider the following code which simulates a random walk in one dimension (we can save it as ``walk.py`` or download from :download:`here `): @@ -190,14 +268,14 @@ to a file with the ``-o`` flag and view it with `profile pstats module `__ or profile visualisation tools like `Snakeviz `__ -or `profile-viewer `__. +or `tuna `__. .. note:: Similar functionality is available in interactive IPython or Jupyter sessions with the magic command `%%prun `__. - +.. _line-profiler: Line-profiler ^^^^^^^^^^^^^ @@ -274,11 +352,14 @@ line-by-line breakdown of where time is being spent. For this information, we ca which is called thousands of times! Moving the module import to the top level saves considerable time. - Performance optimization ------------------------ Once we have identified the bottlenecks, we need to make the corresponding code go faster. +The specific optimization can vary widely based on the computational load +(how big or small the data is, and how frequently a function is executed) +and particular problem at hand. Nevertheless, we present some common methods which can be +handy to know. Algorithm optimization diff --git a/content/optimization_opt.rst b/content/optimization_opt.rst new file mode 100644 index 0000000..8c165d6 --- /dev/null +++ b/content/optimization_opt.rst @@ -0,0 +1,132 @@ +More on benchmarking, profiling and optimizing +============================================== + +Profiling +--------- + +.. _scalene: +Scalene +~~~~~~~ + +Scalene is a sampling profiler. In addition to timings , it can also give insight into: + +- CPU time spent in Python (interpreted), native (compiled) and system function calls +- Memory usage and copy +- GPU utilization +- Memory leak detection + +Moreover, it adds minimal overhead due to profiling. The downside is the results are +less reproducible, because it is a sampling profiler. + +Scalene can be used as a :ref:`scalene-cli`, or using :ref:`scalene-ipy` or in +:ref:`scalene-web` as an interactive widget. Here are some examples profiling +:download:`walk.py ` with Scalene. + +.. _scalene-cli: +CLI tool +^^^^^^^^ + +.. code-block:: console + + $ scalene --cli walk.py + +.. _scalene-ipy: +IPython magic +^^^^^^^^^^^^^ +This allows for profiling a specific function. For example to profile just `walk`, we do as follows: + +.. code-block:: ipython + + In [1]: %load_ext scalene + + In [2]: %run walk.py + + In [3]: %scrun --cli walk(n) + +Gives the following output:: + + SCRUN MAGIC + /home/ashwinmo/Sources/enccs/hpda-python/content/example/walk.py: % of time = 100.00% (1.933s) out of 1.933s. + ╷ ╷ ╷ ╷ ╷ + │Time │–––––– │–––––– │–––––– │ + Line │Python │native │system │GPU │/home/ashwinmo/Sources/enccs/hpda-python/content/example/walk.py + ╺━━━━━━┿━━━━━━━┿━━━━━━━┿━━━━━━━┿━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸ + 1 │ │ │ │ │"""A 1-D random walk. + 2 │ │ │ │ │ + 3 │ │ │ │ │See also: + 4 │ │ │ │ │- https://lectures.scientific-python.org/intro/numpy/auto_examples/plot_randomwalk.html + 5 │ │ │ │ │ + 6 │ │ │ │ │""" + 7 │ │ │ │ │import numpy as np + 8 │ │ │ │ │ + 9 │ │ │ │ │ + 10 │ 6% │ │ │ │def step(): + 11 │ │ │ │ │ import random + 12 │ 7% │ 64% │ 13% │ │ return 1.0 if random.random() > 0.5 else -1.0 + 13 │ │ │ │ │ + 14 │ │ │ │ │ + 15 │ │ │ │ │def walk(n: int, dx: float = 1.0): + 16 │ │ │ │ │ """The for-loop version. + 17 │ │ │ │ │ + 18 │ │ │ │ │ Parameters + 19 │ │ │ │ │ ---------- + 20 │ │ │ │ │ n: int + 21 │ │ │ │ │ Number of time steps + 22 │ │ │ │ │ + 23 │ │ │ │ │ dx: float + 24 │ │ │ │ │ Step size. Default step size is unity. + 25 │ │ │ │ │ + 26 │ │ │ │ │ """ + 27 │ │ │ │ │ xs = np.zeros(n) + 28 │ │ │ │ │ + 29 │ │ │ │ │ for i in range(n - 1): + 30 │ │ │ │ │ x_new = xs[i] + dx * step() + 31 │ 7% │ │ │ │ xs[i + 1] = x_new + 32 │ │ │ │ │ + 33 │ │ │ │ │ return xs + 34 │ │ │ │ │ + 35 │ │ │ │ │ + 36 │ │ │ │ │def walk_vec(n: int, dx: float = 1.0): + 37 │ │ │ │ │ """The vectorized version of :func:`walk` using numpy functions.""" + 38 │ │ │ │ │ import random + 39 │ │ │ │ │ steps = np.array(random.sample([1, -1], k=n, counts=[10 * n, 10 * n])) + 40 │ │ │ │ │ + 41 │ │ │ │ │ # steps = np.random.choice([1, -1], size=n) + 42 │ │ │ │ │ + 43 │ │ │ │ │ dx_steps = dx * steps + 44 │ │ │ │ │ + 45 │ │ │ │ │ # set initial condition to zero + 46 │ │ │ │ │ dx_steps[0] = 0 + 47 │ │ │ │ │ # use cumulative sum to replicate time evolution of position x + 48 │ │ │ │ │ xs = np.cumsum(dx_steps) + 49 │ │ │ │ │ + 50 │ │ │ │ │ return xs + 51 │ │ │ │ │ + 52 │ │ │ │ │ + 53 │ │ │ │ │if __name__ == "__main__": + 54 │ │ │ │ │ n = 1_000_000 + 55 │ │ │ │ │ _ = walk(n) + 56 │ │ │ │ │ _ = walk_vec(n) + 57 │ │ │ │ │ + │ │ │ │ │ + ╶──────┼───────┼───────┼───────┼───────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╴ + │ │ │ │ │function summary for /home/ashwinmo/Sources/enccs/hpda-python/content/example/walk.py + 10 │ 14% │ 69% │ 9% │ │step + 15 │ 7% │ │ │ │walk + ╵ ╵ ╵ ╵ + +If you run the magic command in Jupyter you can use `%scrun walk(n)` instead and it should an output similar to the :ref:`scalene-web` below. + +.. _scalene-web: +Web interface +^^^^^^^^^^^^^ + +Running + +.. code-block:: console + + $ scalene walk.py + +gives + +.. figure:: example/scalene_web.png \ No newline at end of file From 73cef48f6e69ff851ccb0894f76c3c23313407cd Mon Sep 17 00:00:00 2001 From: "Ashwin V. Mohanan" Date: Tue, 21 Jan 2025 21:18:04 +0100 Subject: [PATCH 4/8] New vectorized walk function --- .gitignore | 2 + content/example/walk.py | 60 +++++++++++++++++++++------ content/example/walk_ensemble_plot.py | 28 +++++++++++++ 3 files changed, 78 insertions(+), 12 deletions(-) create mode 100644 content/example/walk_ensemble_plot.py diff --git a/.gitignore b/.gitignore index 078e14b..84d8e21 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,9 @@ /venv* .jupyter_cache jupyter_execute +__pycache__ # pixi environments .pixi *.egg-info +_ipython-input*-profile diff --git a/content/example/walk.py b/content/example/walk.py index 6fbf286..c7cbd89 100644 --- a/content/example/walk.py +++ b/content/example/walk.py @@ -1,20 +1,56 @@ +"""A 1-D random walk. + +See also: +- https://lectures.scientific-python.org/intro/numpy/auto_examples/plot_randomwalk.html + +""" import numpy as np + def step(): import random - return 1. if random.random() > .5 else -1. + return 1.0 if random.random() > 0.5 else -1.0 + + +def walk(n: int, dx: float = 1.0): + """The for-loop version. + + Parameters + ---------- + n: int + Number of time steps + + dx: float + Step size. Default step size is unity. + + """ + xs = np.zeros(n) -def walk(n): - x = np.zeros(n) - dx = 1. / n for i in range(n - 1): - x_new = x[i] + dx * step() - if x_new > 5e-3: - x[i + 1] = 0. - else: - x[i + 1] = x_new - return x + x_new = xs[i] + dx * step() + xs[i + 1] = x_new + + return xs + + +def walk_vec(n: int, dx: float = 1.0): + """The vectorized version of :func:`walk` using numpy functions.""" + import random + steps = np.array(random.sample([1, -1], k=n, counts=[10 * n, 10 * n])) + + # steps = np.random.choice([1, -1], size=n) + + dx_steps = dx * steps + + # set initial condition to zero + dx_steps[0] = 0 + # use cumulative sum to replicate time evolution of position x + xs = np.cumsum(dx_steps) + + return xs + if __name__ == "__main__": - n = 100000 - x = walk(n) + n = 1_000_000 + _ = walk(n) + _ = walk_vec(n) diff --git a/content/example/walk_ensemble_plot.py b/content/example/walk_ensemble_plot.py new file mode 100644 index 0000000..8b09efa --- /dev/null +++ b/content/example/walk_ensemble_plot.py @@ -0,0 +1,28 @@ +import numpy as np +import matplotlib.pyplot as plt +# See walk.py for the implementation +import walk + + +n_stories = 1000 +t_max = 200 +positions = np.empty((n_stories, t_max)) + +for i_story in range(n_stories): + positions[i_story, :] = walk.walk(t_max, 1) + +# Determine the time evolution of the root-mean-square distance. +sq_distance = positions**2 +# Root mean square distance +rms_distance = np.sqrt(np.mean(sq_distance, axis=0)) + +t = np.arange(t_max) + +fig, ax = plt.subplots() +ax.plot(t, rms_distance, "g", label="ensemble RMS distance") +ax.plot(t, np.sqrt(t), "k--", label=r"theoretical $\sqrt{\langle (\delta x)^2 \rangle}$") +ax.set(xlabel="time", ylabel="x") +ax.legend() + +plt.tight_layout() +plt.show() From 824ede7b7408fdb44dc226163efbed078733f7d8 Mon Sep 17 00:00:00 2001 From: "Ashwin V. Mohanan" Date: Tue, 21 Jan 2025 21:19:58 +0100 Subject: [PATCH 5/8] Note on CPU bound and I/O bound --- content/optimization.rst | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/content/optimization.rst b/content/optimization.rst index 3f68164..26252ae 100644 --- a/content/optimization.rst +++ b/content/optimization.rst @@ -54,7 +54,7 @@ One of the easy way to benchmark is to use the time function: The IPython "magic" command :py:meth:`%time ` -can also be used to quickly print the same with less effort as follows: +can also be used to make a similar benchmark with less effort as follows: .. code-block:: ipython @@ -98,7 +98,14 @@ to benchmark a full cell containing a block of code. #. Run ``%time square_sum(a)`` a couple of times. Do you get the same result? #. Run ``%timeit square_sum(a)`` a couple of times. Do you get the same result? + #. (optional) execute the following benchmark and + compare it with output of question number 1. + .. code-block:: ipython + + from urllib.request import urlopen + + %time urlopen("https://raw.githubusercontent.com/ENCCS/hpda-python/refs/heads/main/content/data/tas1840.nc") .. solution:: @@ -143,10 +150,10 @@ to benchmark a full cell containing a block of code. .. code-block:: ipython In [4]: %timeit square_sum(a) - 1.62 μs +/- 55.4 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) + 1.62 μs ± 55.4 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) In [5]: %timeit square_sum(a) - 1.6 μs +/- 46.6 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) + 1.6 μs ± 46.6 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each) By making several measurements, we manage to reduce jitter and the measurement is more reliable @@ -155,6 +162,27 @@ to benchmark a full cell containing a block of code. For long running calls, using ``%time`` instead of ``%timeit``; it is less precise but faster + + 3. (optional) Comparing benchmarks of ``%time square_sum(a)`` and + ``%time urlopen(...)``. + + .. code-block:: ipython + + In [6]: from urllib.request import urlopen + + In [7]: %time urlopen("https://raw.githubusercontent.com/ENCCS/hpda-python/refs/heads/main/content/data/tas1840.nc") + CPU times: user 4.66 ms, sys: 974 μs, total: 5.63 ms + Wall time: 21.4 ms + Out[7]: + + In (1) we see that the *CPU time* and *Wall time* is comparable which indicates that the + operation is CPU bound. + + However in (3) we clearly see that **CPU time is lower + than wall-time**, from which we can deduce that it is not a CPU-bound operation. + In this particular case, the operation was I/O bound. + Some common I/O bound operations are network related, or due to + latency in filesystems or use of inefficient file storage formats. Profiling From ce4a00cedc1ee404e5cbb6d4fcea28bccf53e30e Mon Sep 17 00:00:00 2001 From: "Ashwin V. Mohanan" Date: Tue, 21 Jan 2025 22:23:25 +0100 Subject: [PATCH 6/8] Add headings and exercise for profiling --- content/optimization.rst | 28 ++++++++++++++++++++++++++++ content/optimization_opt.rst | 6 +++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/content/optimization.rst b/content/optimization.rst index 26252ae..8a076b3 100644 --- a/content/optimization.rst +++ b/content/optimization.rst @@ -84,6 +84,9 @@ One can also use the cell magic :py:meth:`%timeit ` to benchmark a full cell containing a block of code. +Exercise 1 +---------- + .. exercise:: Start with the following code:: @@ -275,6 +278,7 @@ cProfile As a demo, let us consider the following code which simulates a random walk in one dimension (we can save it as ``walk.py`` or download from :download:`here `): +.. _walk-py-script: .. literalinclude:: example/walk.py We can profile it with ``cProfile``: @@ -380,6 +384,30 @@ line-by-line breakdown of where time is being spent. For this information, we ca which is called thousands of times! Moving the module import to the top level saves considerable time. +Exercise 2 +---------- + +.. exercise:: + + Start by copying in the script :ref:`walk.py ` . + + #. Use ``%timeit`` magic command in Jupyter + to benchmark the functions ``walk(1_000_000)`` and ``walk_vec(1_000_000)``. + Which is faster? + #. Use:: + + %load_ext line_profiler + %lprun -f walk_vec walk_vec(1_000_000) + + to apply line-profiler on ``walk_vec`` function. What is the bottleneck? + #. Modify the following lines to use to change how the ``steps`` array is initialized. + Redo the above benchmark and profiling. Does it improve the performance? + + .. literalinclude:: example/walk.py + :pyobject: walk_vec + :emphasize-lines: 3-6 + + Performance optimization ------------------------ diff --git a/content/optimization_opt.rst b/content/optimization_opt.rst index 8c165d6..73e7449 100644 --- a/content/optimization_opt.rst +++ b/content/optimization_opt.rst @@ -1,5 +1,5 @@ -More on benchmarking, profiling and optimizing -============================================== +Benchmarking, profiling and optimizing (II) +=========================================== Profiling --------- @@ -127,6 +127,6 @@ Running $ scalene walk.py -gives +opens up the following web app: .. figure:: example/scalene_web.png \ No newline at end of file From bff6322bf2e951c055839153b42f7ea25bde32b9 Mon Sep 17 00:00:00 2001 From: "Ashwin V. Mohanan" Date: Tue, 21 Jan 2025 22:47:04 +0100 Subject: [PATCH 7/8] Add solutions to exercise 2 in profiling --- content/optimization.rst | 102 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 99 insertions(+), 3 deletions(-) diff --git a/content/optimization.rst b/content/optimization.rst index 8a076b3..fe12ca4 100644 --- a/content/optimization.rst +++ b/content/optimization.rst @@ -342,9 +342,10 @@ line-by-line breakdown of where time is being spent. For this information, we ca - Based on the output, can you spot a mistake which is affecting performance? - .. solution:: Line-profiling output + .. callout:: Line-profiling output + :class: dropdown - .. code-block:: console + :: Wrote profile results to walk.py.lprof Timer unit: 1e-06 s @@ -389,7 +390,8 @@ Exercise 2 .. exercise:: - Start by copying in the script :ref:`walk.py ` . + Start by copying in the script :ref:`walk.py ` into Jupyter or + :download:`download it ` and execute ``%run walk.py`` #. Use ``%timeit`` magic command in Jupyter to benchmark the functions ``walk(1_000_000)`` and ``walk_vec(1_000_000)``. @@ -401,12 +403,106 @@ Exercise 2 to apply line-profiler on ``walk_vec`` function. What is the bottleneck? #. Modify the following lines to use to change how the ``steps`` array is initialized. + Execute it to re-initialize ``walk_vec``. Redo the above benchmark and profiling. Does it improve the performance? .. literalinclude:: example/walk.py :pyobject: walk_vec :emphasize-lines: 3-6 +.. solution:: + + #. Benchmarking ``walk`` and ``walk_vec`` + + .. code-block:: ipython + + In [1]: %run walk.py + + In [2]: %timeit walk(1_000_000) + 246 ms ± 2.59 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) + + In [3]: %timeit walk_vec(1_000_000) + 397 ms ± 6.38 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) + + Shows ``walk_vec``, although use vectorised operations, is slower. + Although it is not directly obvious why. + + #. Profiling ``walk_vec`` + + .. code-block:: ipython + + In [4]: %load_ext line_profiler + + In [5]: %lprun -f walk_vec walk_vec(1_000_000) + + illustrates how creating the ``steps`` array consumes more than 99% of the total time:: + + Timer unit: 1e-09 s + + Total time: 1.14911 s + File: /home/ashwinmo/Sources/enccs/hpda-python/content/example/walk.py + Function: walk_vec at line 36 + + Line # Hits Time Per Hit % Time Line Contents + ============================================================== + 36 def walk_vec(n: int, dx: float = 1.0): + 37 """The vectorized version of :func:`walk` using numpy functions.""" + 38 1 3374.0 3374.0 0.0 import random + 39 1 1145604166.0 1e+09 99.7 steps = np.array(random.sample([1, -1], k=n, counts=[10 * n, 10 * n])) + 40 + 41 # steps = np.random.choice([1, -1], size=n) + 42 + 43 1 1085779.0 1e+06 0.1 dx_steps = dx * steps + 44 + 45 # set initial condition to zero + 46 1 3666.0 3666.0 0.0 dx_steps[0] = 0 + 47 # use cumulative sum to replicate time evolution of position x + 48 1 2408374.0 2e+06 0.2 xs = np.cumsum(dx_steps) + 49 + 50 1 507.0 507.0 0.0 return xs + + This is because `random.sample` is part of the standard library and produces a list. + + #. After modifying ``walk_vec`` function, we see it is much faster. + + .. code-block:: ipython + + In [7]: %ed walk.py + Editing... done. Executing edited code... + + In [8]: %timeit walk(1_000_000) + 259 ms ± 14.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) + + In [9]: %timeit walk_vec(1_000_000) + 6.49 ms ± 90.4 μs per loop (mean ± std. dev. of 7 runs, 100 loops each) + + In [10]: %lprun -f walk_vec walk_vec(1_000_000) + + Line-profiler output:: + + Timer unit: 1e-09 s + + Total time: 0.0078706 s + File: /home/ashwinmo/Sources/enccs/hpda-python/content/example/walk.py + Function: walk_vec at line 36 + + Line # Hits Time Per Hit % Time Line Contents + ============================================================== + 36 def walk_vec(n: int, dx: float = 1.0): + 37 """The vectorized version of :func:`walk` using numpy functions.""" + 38 # import random + 39 # steps = np.array(random.sample([1, -1], k=n, counts=[10 * n, 10 * n])) + 40 + 41 1 4323251.0 4e+06 54.9 steps = np.random.choice([1, -1], size=n) + 42 + 43 1 1142060.0 1e+06 14.5 dx_steps = dx * steps + 44 + 45 # set initial condition to zero + 46 1 2907.0 2907.0 0.0 dx_steps[0] = 0 + 47 # use cumulative sum to replicate time evolution of position x + 48 1 2401730.0 2e+06 30.5 xs = np.cumsum(dx_steps) + 49 + 50 1 649.0 649.0 0.0 return xs Performance optimization ------------------------ From 2ac3d80e4e1c6a41240588f9d95e4fd34942a960 Mon Sep 17 00:00:00 2001 From: "Ashwin V. Mohanan" Date: Tue, 21 Jan 2025 22:58:02 +0100 Subject: [PATCH 8/8] Add sphinx-hoverxref extension --- requirements.in | 1 + requirements.txt | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/requirements.in b/requirements.in index e49ae8a..2843de0 100644 --- a/requirements.in +++ b/requirements.in @@ -4,3 +4,4 @@ sphinx_rtd_theme_ext_color_contrast myst_nb sphinx-lesson>=0.8.19 pillow +sphinx-hoverxref \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 6e084f6..4ef4c53 100644 --- a/requirements.txt +++ b/requirements.txt @@ -176,6 +176,7 @@ sphinx==7.4.7 # myst-parser # sphinx-autobuild # sphinx-copybutton + # sphinx-hoverxref # sphinx-lesson # sphinx-rtd-theme # sphinx-rtd-theme-ext-color-contrast @@ -186,6 +187,8 @@ sphinx-autobuild==2024.10.3 # via sphinx-lesson sphinx-copybutton==0.5.2 # via sphinx-lesson +sphinx-hoverxref==1.4.2 + # via -r requirements.in sphinx-lesson==0.8.19 # via -r requirements.in sphinx-minipres==0.2.1 @@ -209,7 +212,9 @@ sphinxcontrib-devhelp==2.0.0 sphinxcontrib-htmlhelp==2.1.0 # via sphinx sphinxcontrib-jquery==4.1 - # via sphinx-rtd-theme + # via + # sphinx-hoverxref + # sphinx-rtd-theme sphinxcontrib-jsmath==1.0.1 # via sphinx sphinxcontrib-qthelp==2.0.0