From b90d60149042947ebb49ddd1f798b3a920d35aa4 Mon Sep 17 00:00:00 2001 From: Tim Diller Date: Thu, 23 Oct 2025 13:48:00 -0500 Subject: [PATCH] Day 4 notebook and README links --- README.md | 18 + files/Day4.ipynb | 2001 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 2019 insertions(+) create mode 100644 files/Day4.ipynb diff --git a/README.md b/README.md index 9af9d6f..4dc4e0c 100644 --- a/README.md +++ b/README.md @@ -32,3 +32,21 @@ $ pip install -e . - [PyData Sphinx Theme](https://pydata-sphinx-theme.readthedocs.io/en/stable/) - [Sphinx AutoAPI](https://sphinx-autoapi.readthedocs.io/en/latest/) - Find the refactoring Give It A Try in `files/convert_mass.py` + +# Day 4 Resourecs +- The `[Day 4 Notebook](files/Day4.ipynb) is in `files/Day4.ipynb`. +- [Arrays and Lists](https://blog.dillerdigital.com/arrays-and-lists/) from the Diller Digital Blog +- [Cython](https://cython.org/) - tool for building C extensions in Python. Particularly good for seamlessly handing off Numpy `ndarray`s to C-array code. Tim and Corran's former coworker Kurt Smith literally [wrote the book](https://www.oreilly.com/library/view/cython/9781491901731/) on Cython. +- [`ctypes`](https://docs.python.org/3/library/ctypes.html) - a lower level tool for extending Python with C. +- [Tim's favorite logging setup](https://github.com/timdiller/favorite_logging_setup) on Github. +- [`line_profiler`](https://kernprof.readthedocs.io/en/latest/#line-profiler-basic-usage) written by Tim and Corran's former coworker Robert Kern (hence the name `kernprof` for the command line tool). Summary of usage: + ``` + > pip install line_profiler + # add `from line_profiler import profile` to module to be profiled + # decorate functions to be profiled with `@profile` + > kernprof -l module_to_profile.py + Wrote profile results to 'module_to_profile.py.lprof' + Inspect results with: + python -m line_profiler -rmt module_to_profile.py.lprof + > python -m line_profiler -rmt module_to_profile.py.lprof + ``` diff --git a/files/Day4.ipynb b/files/Day4.ipynb new file mode 100644 index 0000000..1715325 --- /dev/null +++ b/files/Day4.ipynb @@ -0,0 +1,2001 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "b644e953-5404-4364-ad7d-5da1266490aa", + "metadata": {}, + "outputs": [], + "source": [ + "%run live_coding/lecture05.py" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "3f7aa5ee-bed9-4621-8377-c46f515cfe89", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Variable Type Data/Info\n", + "------------------------------------\n", + "div function \n", + "logging module .12/logging/__init__.py'>\n", + "test_logging function \n" + ] + } + ], + "source": [ + "whos" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "81cff98a-f524-472c-bdc3-21a4d1a3208a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[31mSignature:\u001b[39m test_logging()\n", + "\u001b[31mSource:\u001b[39m \n", + "\u001b[38;5;28;01mdef\u001b[39;00m test_logging():\n", + " \u001b[33m\"\"\"Function to test logging levels.\"\"\"\u001b[39m\n", + " print(\u001b[33m\"This always prints.\"\u001b[39m)\n", + " logging.critical(\u001b[33m\"Critical Message\"\u001b[39m)\n", + " logging.error(\u001b[33m\"Error Message\"\u001b[39m)\n", + " logging.warning(\u001b[33m\"Warning Message\"\u001b[39m)\n", + " logging.info(\u001b[33m\"Info Message\"\u001b[39m)\n", + " logging.debug(\u001b[33m\"Debug Message\"\u001b[39m)\n", + "\u001b[31mFile:\u001b[39m ~/Documents/Diller_Digital_SWNG/live_coding/lecture05.py\n", + "\u001b[31mType:\u001b[39m function" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "test_logging??" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ee125cd5-3b98-47a5-8161-906d9d480d2b", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "CRITICAL:root:Critical Message\n", + "ERROR:root:Error Message\n", + "WARNING:root:Warning Message\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This always prints.\n" + ] + } + ], + "source": [ + "test_logging()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "69c1ff9e-a066-4254-be3a-b444f8709e2d", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "logging.basicConfig(level=logging.INFO, force=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "da245cec-e316-4a76-954b-ac90dbc76793", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "CRITICAL:root:Critical Message\n", + "ERROR:root:Error Message\n", + "WARNING:root:Warning Message\n", + "INFO:root:Info Message\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This always prints.\n" + ] + } + ], + "source": [ + "test_logging()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "2c5d81b7-e2d2-497a-95b1-0cb1b2a3f8ab", + "metadata": {}, + "outputs": [], + "source": [ + "logger = logging.getLogger()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "c2f04f99-120a-43c2-9f7e-7a3110da35b1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "logger" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "fbdb085d-2af9-4ec8-865e-de136b236515", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "CRITICAL:root:Critical Message\n", + "ERROR:root:Error Message\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This always prints.\n" + ] + } + ], + "source": [ + "logger.setLevel(logging.ERROR)\n", + "test_logging()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "85620e6f-2523-4095-8ab4-3a9282bad5e4", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "CRITICAL:root:Critical Message\n", + "ERROR:root:Error Message\n", + "WARNING:root:Warning Message\n", + "INFO:root:Info Message\n", + "DEBUG:root:Debug Message\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This always prints.\n" + ] + } + ], + "source": [ + "logger.setLevel(logging.NOTSET)\n", + "test_logging()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "82e1258a-8d14-4522-83cc-f8a742b4b6a0", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Hello my name is Inigo\n" + ] + } + ], + "source": [ + "logger.info(\"Hello my name is Inigo\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "a114ac1a-8400-4f5e-afe6-d08086845a0b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "logger.handlers" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "369503bc-095b-486b-a9c4-fd61f8be36dc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "h = logger.handlers[0]\n", + "h" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "4a32033e-d96b-46a5-b99e-d625e397e5b2", + "metadata": {}, + "outputs": [], + "source": [ + "h.setLevel(logging.ERROR)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "9e49a2d8-83ed-4f99-b87e-a2fe1eb108f3", + "metadata": {}, + "outputs": [], + "source": [ + "logger.info(\"Hello\")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "2383ecfe-9921-4f36-975a-5c2ef5accc42", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "h.formatter" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "80b8e630-ee86-4d4f-82a7-634530013f62", + "metadata": {}, + "outputs": [], + "source": [ + "f = h.formatter" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "b105177b-28c3-445e-a8e8-8093f8752abd", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-10-23 10:33:28,982:() - Help Help\n" + ] + } + ], + "source": [ + "f2 = logging.Formatter('%(asctime)s:%(funcName)s() - %(message)s')\n", + "h.setFormatter(f2)\n", + "logger.critical(\"Help Help\")" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "a8fc2123-1543-4fbb-84dd-12ef77059a60", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-10-23 10:34:09,665:test_logging() - Critical Message\n", + "2025-10-23 10:34:09,667:test_logging() - Error Message\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This always prints.\n" + ] + } + ], + "source": [ + "test_logging()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "990f20dc-b033-40e3-a6a0-d43aa3c9f980", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "CRITICAL:root:Critical Message\n", + "ERROR:root:Error Message\n", + "WARNING:root:Warning Message\n", + "INFO:root:Info Message\n", + "DEBUG:root:Debug Message\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This always prints.\n" + ] + } + ], + "source": [ + "logging.basicConfig(force=True)\n", + "test_logging()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "1c5f9550-1115-411c-875f-5a799856956f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'__main__'" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "__name__" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "ba93a4d1-f02f-40a8-8a81-71a53f3382d5", + "metadata": {}, + "outputs": [], + "source": [ + "logger = logging.getLogger(__name__)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "49d05cb0-6346-4b18-a5b2-fb7ce990f99c", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:__main__:Hi\n" + ] + } + ], + "source": [ + "logger.warning(\"Hi\")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "02558566-5c42-4951-af32-f27025e00cdf", + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "h2 = logging.StreamHandler(sys.stdout)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "bd9f231f-3fa0-4979-890a-6bb40be64c0f", + "metadata": {}, + "outputs": [], + "source": [ + "logger = logging.getLogger(__name__)\n", + "logger.handlers.append(h2)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "7b0a7c8f-f3dd-42ef-aa82-b98ae5b592fb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hi\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ERROR:__main__:Hi\n" + ] + } + ], + "source": [ + "logger.error(\"Hi\")" + ] + }, + { + "cell_type": "markdown", + "id": "d38c51cc-df40-4d45-a7f8-4fe0d36ab3f9", + "metadata": {}, + "source": [ + "# Lecture 6 - Profiling and Debugging\n", + "`demo/Software_Engineering/citation_network`" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "3af3737f-66d2-4270-8759-7ce4e1b56435", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/timdiller/Documents/Diller_Digital_SWNG/demo/Software_Engineering/citation_network\n" + ] + } + ], + "source": [ + "%cd demo/Software_Engineering/citation_network/" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "427ed209-89d1-43de-8ca3-cf995ee68769", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 0.0% 0\n", + " 10.0% 0\n", + " 20.0% 1\n", + " 30.0% 1\n", + " 40.0% 3\n", + " 50.0% 4\n", + " 60.0% 6\n", + " 70.0% 9\n", + " 80.0% 15\n", + " 90.0% 29\n", + "100.0% 2414\n", + " " + ] + }, + { + "data": { + "text/plain": [ + " 1101027 function calls (1101014 primitive calls) in 0.480 seconds\n", + "\n", + " Ordered by: internal time\n", + "\n", + " ncalls tottime percall cumtime percall filename:lineno(function)\n", + " 1 0.200 0.200 0.218 0.218 citation_network_slow.py:53(build_index)\n", + " 3 0.084 0.028 0.605 0.202 selectors.py:558(select)\n", + " 1 0.079 0.079 0.111 0.111 citation_network_slow.py:37(load_citations)\n", + " 705636 0.034 0.000 0.034 0.000 {method 'append' of 'list' objects}\n", + " 352809 0.029 0.000 0.029 0.000 {method 'split' of 'str' objects}\n", + " 3 0.025 0.008 0.514 0.171 {method 'control' of 'select.kqueue' objects}\n", + " 1 0.013 0.013 0.351 0.351 citation_network_slow.py:1()\n", + " 1 0.004 0.004 0.004 0.004 {built-in method builtins.sorted}\n", + " 1 0.002 0.002 0.003 0.003 citation_network_slow.py:74(citation_counts)\n", + " 1158 0.002 0.000 0.003 0.000 ipkernel.py:797(_clean_thread_parent_frames)\n", + " 1 0.001 0.001 0.001 0.001 {built-in method builtins.compile}\n", + " 27801 0.001 0.000 0.001 0.000 {built-in method builtins.len}\n", + " 579 0.001 0.000 0.001 0.000 threading.py:1535(enumerate)\n", + " 5790 0.001 0.000 0.001 0.000 threading.py:1198(ident)\n", + " 682 0.000 0.000 0.000 0.000 {built-in method _codecs.ascii_decode}\n", + " 1 0.000 0.000 0.338 0.338 citation_network_slow.py:118(main)\n", + " 3 0.000 0.000 0.000 0.000 {built-in method _io.open}\n", + " 3 0.000 0.000 0.606 0.202 base_events.py:1915(_run_once)\n", + " 1 0.000 0.000 0.000 0.000 pathlib.py:1228(resolve)\n", + " 2316 0.000 0.000 0.000 0.000 {method 'keys' of 'dict' objects}\n", + " 682 0.000 0.000 0.001 0.000 ascii.py:25(decode)\n", + " 1 0.000 0.000 0.000 0.000 {method 'read' of '_io.BufferedReader' objects}\n", + " 2 0.000 0.000 0.000 0.000 :60(isabs)\n", + " 4 0.000 0.000 0.000 0.000 attrsettr.py:66(_get_attr_opt)\n", + " 3/1 0.000 0.000 0.480 0.480 {built-in method builtins.exec}\n", + " 1158 0.000 0.000 0.000 0.000 {method 'values' of 'dict' objects}\n", + "1232/1228 0.000 0.000 0.000 0.000 {built-in method builtins.isinstance}\n", + " 1 0.000 0.000 0.000 0.000 {built-in method posix.getcwd}\n", + " 1 0.000 0.000 0.000 0.000 {method 'execute' of 'sqlite3.Connection' objects}\n", + " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", + " 581 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.RLock' objects}\n", + " 1 0.000 0.000 0.000 0.000 socket.py:623(send)\n", + " 1 0.000 0.000 0.004 0.004 citation_network_slow.py:83(get_percentiles)\n", + " 2/1 0.000 0.000 0.000 0.000 interactiveshell.py:2878(safe_execfile)\n", + " 3 0.000 0.000 0.000 0.000 {method '__exit__' of '_io._IOBase' objects}\n", + " 9 0.000 0.000 0.000 0.000 {built-in method sys.intern}\n", + " 2 0.000 0.000 0.000 0.000 iostream.py:662(write)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:3631(set)\n", + " 1 0.000 0.000 0.000 0.000 inspect.py:3133(_bind)\n", + " 24 0.000 0.000 0.000 0.000 enum.py:1538(_get_value)\n", + " 4 0.000 0.000 0.000 0.000 {method 'run' of '_contextvars.Context' objects}\n", + " 2 0.000 0.000 0.000 0.000 socket.py:771(recv_multipart)\n", + " 2 0.000 0.000 0.000 0.000 {method '__exit__' of 'sqlite3.Connection' objects}\n", + " 4 0.000 0.000 0.000 0.000 attrsettr.py:43(__getattr__)\n", + " 2 0.000 0.000 0.000 0.000 pathlib.py:387(_parse_path)\n", + " 2 0.000 0.000 0.000 0.000 interactiveshell.py:3043(write)\n", + " 8 0.000 0.000 0.000 0.000 {built-in method builtins.next}\n", + " 1 0.000 0.000 0.000 0.000 history.py:1024(writeout_cache)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method posix.lstat}\n", + " 2 0.000 0.000 0.000 0.000 threading.py:299(__enter__)\n", + " 2 0.000 0.000 0.000 0.000 zmqstream.py:573(_handle_events)\n", + " 1 0.000 0.000 0.000 0.000 traitlets.py:1527(_notify_observers)\n", + " 6 0.000 0.000 0.000 0.000 pathlib.py:437(__str__)\n", + " 9 0.000 0.000 0.000 0.000 traitlets.py:676(__get__)\n", + " 11 0.000 0.000 0.000 0.000 citation_network_slow.py:98(value_at_rank)\n", + " 3 0.000 0.000 0.000 0.000 pathlib.py:1157(__init__)\n", + " 6 0.000 0.000 0.000 0.000 enum.py:1556(__and__)\n", + " 3 0.000 0.000 0.000 0.000 pathlib.py:358(__init__)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method _heapq.heappop}\n", + " 14 0.000 0.000 0.000 0.000 enum.py:720(__call__)\n", + " 1 0.000 0.000 0.000 0.000 base_events.py:813(_call_soon)\n", + " 2 0.000 0.000 0.000 0.000 pathlib.py:407(_load_parts)\n", + " 9 0.000 0.000 0.000 0.000 {built-in method builtins.hasattr}\n", + " 4 0.000 0.000 0.000 0.000 events.py:86(_run)\n", + " 6 0.000 0.000 0.000 0.000 typing.py:392(inner)\n", + " 11 0.000 0.000 0.000 0.000 {method 'format' of 'str' objects}\n", + " 2 0.000 0.000 0.000 0.000 :71(join)\n", + " 9 0.000 0.000 0.000 0.000 traitlets.py:629(get)\n", + " 4 0.000 0.000 0.000 0.000 pathlib.py:551(drive)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:3474(validate)\n", + " 3 0.000 0.000 0.000 0.000 pathlib.py:1164(__new__)\n", + " 1 0.000 0.000 0.000 0.000 decorator.py:200(fix)\n", + " 3 0.000 0.000 0.000 0.000 pathlib.py:429(_format_parsed_parts)\n", + " 7/3 0.000 0.000 0.000 0.000 {method 'acquire' of '_thread.lock' objects}\n", + " 2 0.000 0.000 0.000 0.000 base_events.py:766(call_at)\n", + " 1 0.000 0.000 0.000 0.000 iostream.py:128(_event_pipe_gc)\n", + " 2 0.000 0.000 0.000 0.000 tasks.py:653(sleep)\n", + " 2 0.000 0.000 0.000 0.000 {built-in method builtins.issubclass}\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:718(_validate)\n", + " 2 0.000 0.000 0.000 0.000 {built-in method _heapq.heappush}\n", + " 1 0.000 0.000 0.000 0.000 events.py:155(cancel)\n", + " 2 0.000 0.000 0.000 0.000 zmqstream.py:676(_update_handler)\n", + " 1 0.000 0.000 0.000 0.000 iostream.py:119(_run_event_pipe_gc)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:689(set)\n", + " 1 0.000 0.000 0.000 0.000 :423(realpath)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:727(_cross_validate)\n", + " 3 0.000 0.000 0.000 0.000 events.py:36(__init__)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method posix.stat}\n", + " 1 0.000 0.000 0.000 0.000 decorator.py:232(fun)\n", + " 9 0.000 0.000 0.000 0.000 base_events.py:733(time)\n", + " 2 0.000 0.000 0.000 0.000 zmqstream.py:614(_handle_recv)\n", + " 2/1 0.000 0.000 0.000 0.000 :1()\n", + " 1 0.000 0.000 0.000 0.000 inspect.py:3272(bind)\n", + " 1 0.000 0.000 0.000 0.000 syspathcontext.py:11(__enter__)\n", + " 5 0.000 0.000 0.000 0.000 pathlib.py:447(__fspath__)\n", + " 1 0.000 0.000 0.000 0.000 history.py:92(only_when_enabled)\n", + " 4 0.000 0.000 0.000 0.000 threading.py:1222(is_alive)\n", + " 8 0.000 0.000 0.000 0.000 {built-in method builtins.max}\n", + " 1 0.000 0.000 0.000 0.000 citation_network_slow.py:110(make_percentiles_table)\n", + " 1 0.000 0.000 0.000 0.000 :432(_joinrealpath)\n", + " 2 0.000 0.000 0.000 0.000 zmqstream.py:653(_rebuild_io_state)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:708(__set__)\n", + " 1 0.000 0.000 0.000 0.000 py3compat.py:52(execfile)\n", + " 1 0.000 0.000 0.000 0.000 inspect.py:2949(apply_defaults)\n", + " 4 0.000 0.000 0.000 0.000 :1390(_handle_fromlist)\n", + " 14 0.000 0.000 0.000 0.000 enum.py:1123(__new__)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:3624(validate_elements)\n", + " 1 0.000 0.000 0.000 0.000 :408(abspath)\n", + " 4 0.000 0.000 0.000 0.000 typing.py:1285(__hash__)\n", + " 1 0.000 0.000 0.000 0.000 iostream.py:260(schedule)\n", + " 2 0.000 0.000 0.000 0.000 base_events.py:742(call_later)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method builtins.print}\n", + " 2 0.000 0.000 0.000 0.000 pathlib.py:380(with_segments)\n", + " 1 0.000 0.000 0.000 0.000 traitlets.py:1512(_notify_trait)\n", + " 1 0.000 0.000 0.000 0.000 traitlets.py:1523(notify_change)\n", + " 1 0.000 0.000 0.000 0.000 contextlib.py:104(__init__)\n", + " 1 0.000 0.000 0.000 0.000 threading.py:311(_acquire_restore)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:2304(validate)\n", + " 1 0.000 0.000 0.000 0.000 pathlib.py:1398(expanduser)\n", + " 1 0.000 0.000 0.000 0.000 contextlib.py:141(__exit__)\n", + " 5 0.000 0.000 0.000 0.000 {built-in method builtins.getattr}\n", + " 2 0.000 0.000 0.000 0.000 queue.py:97(empty)\n", + " 1 0.000 0.000 0.000 0.000 inspect.py:2896(args)\n", + " 2 0.000 0.000 0.000 0.000 :138(splitroot)\n", + " 2 0.000 0.000 0.000 0.000 iostream.py:158(_handle_event)\n", + " 12/11 0.000 0.000 0.000 0.000 {built-in method posix.fspath}\n", + " 2 0.000 0.000 0.000 0.000 typing.py:1492(__subclasscheck__)\n", + " 1 0.000 0.000 0.000 0.000 contextlib.py:299(helper)\n", + " 1 0.000 0.000 0.000 0.000 pathlib.py:731(parent)\n", + " 30 0.000 0.000 0.000 0.000 typing.py:2183(cast)\n", + " 9 0.000 0.000 0.000 0.000 {built-in method time.monotonic}\n", + " 1 0.000 0.000 0.000 0.000 history.py:1016(_writeout_output_cache)\n", + " 1 0.000 0.000 0.000 0.000 zmqstream.py:684()\n", + " 1 0.000 0.000 0.000 0.000 asyncio.py:216(call_at)\n", + " 2 0.000 0.000 0.000 0.000 events.py:111(__init__)\n", + " 4 0.000 0.000 0.000 0.000 selector_events.py:750(_process_events)\n", + " 1 0.000 0.000 0.000 0.000 pathlib.py:1005(open)\n", + " 2 0.000 0.000 0.000 0.000 zmqstream.py:546(_run_callback)\n", + " 4 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}\n", + " 1 0.000 0.000 0.000 0.000 ioloop.py:604(call_later)\n", + " 1 0.000 0.000 0.000 0.000 futures.py:313(_set_result_unless_cancelled)\n", + " 2 0.000 0.000 0.000 0.000 {built-in method _abc._abc_subclasscheck}\n", + " 1 0.000 0.000 0.000 0.000 history.py:1008(_writeout_input_cache)\n", + " 1 0.000 0.000 0.000 0.000 syspathcontext.py:18(__exit__)\n", + " 2 0.000 0.000 0.000 0.000 iostream.py:557(_is_master_process)\n", + " 2 0.000 0.000 0.000 0.000 enum.py:1545(__or__)\n", + " 2 0.000 0.000 0.000 0.000 typing.py:1221(__instancecheck__)\n", + " 5 0.000 0.000 0.000 0.000 {method 'startswith' of 'str' objects}\n", + " 1 0.000 0.000 0.000 0.000 {method 'set_result' of '_asyncio.Future' objects}\n", + " 2 0.000 0.000 0.000 0.000 threading.py:302(__exit__)\n", + " 1 0.000 0.000 0.000 0.000 contextlib.py:132(__enter__)\n", + " 2 0.000 0.000 0.000 0.000 iostream.py:584(_schedule_flush)\n", + " 2 0.000 0.000 0.000 0.000 :121(__subclasscheck__)\n", + " 7 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.lock' objects}\n", + " 1 0.000 0.000 0.000 0.000 threading.py:308(_release_save)\n", + " 1 0.000 0.000 0.000 0.000 threading.py:627(clear)\n", + " 3 0.000 0.000 0.000 0.000 {built-in method __new__ of type object at 0x101e64a30}\n", + " 4 0.000 0.000 0.000 0.000 :41(_get_sep)\n", + " 4 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects}\n", + " 1 0.000 0.000 0.000 0.000 ioloop.py:750(_run_callback)\n", + " 1 0.000 0.000 0.000 0.000 inspect.py:2919(kwargs)\n", + " 2 0.000 0.000 0.000 0.000 iostream.py:512(parent_header)\n", + " 4 0.000 0.000 0.000 0.000 threading.py:1155(_wait_for_tstate_lock)\n", + " 1 0.000 0.000 0.000 0.000 {method 'values' of 'mappingproxy' objects}\n", + " 1 0.000 0.000 0.000 0.000 iostream.py:594(_schedule_in_thread)\n", + " 1 0.000 0.000 0.000 0.000 base_events.py:446(create_future)\n", + " 2 0.000 0.000 0.000 0.000 zmqstream.py:532(sending)\n", + " 2 0.000 0.000 0.000 0.000 ioloop.py:549(time)\n", + " 1 0.000 0.000 0.000 0.000 pathlib.py:420(_from_parsed_parts)\n", + " 5 0.000 0.000 0.000 0.000 {method 'append' of 'collections.deque' objects}\n", + " 1 0.000 0.000 0.000 0.000 {built-in method _thread.allocate_lock}\n", + " 1 0.000 0.000 0.000 0.000 {built-in method posix._path_normpath}\n", + " 1 0.000 0.000 0.000 0.000 builtin_trap.py:53(__exit__)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:3486(validate_elements)\n", + " 1 0.000 0.000 0.000 0.000 pathlib.py:835(stat)\n", + " 5 0.000 0.000 0.000 0.000 {method 'popleft' of 'collections.deque' objects}\n", + " 1 0.000 0.000 0.000 0.000 iostream.py:139(_event_pipe)\n", + " 3 0.000 0.000 0.000 0.000 {built-in method builtins.min}\n", + " 1 0.000 0.000 0.000 0.000 :260(__init__)\n", + " 2 0.000 0.000 0.000 0.000 {built-in method _contextvars.copy_context}\n", + " 3 0.000 0.000 0.000 0.000 {method 'items' of 'mappingproxy' objects}\n", + " 4 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects}\n", + " 1 0.000 0.000 0.000 0.000 :131(splitdrive)\n", + " 4 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}\n", + " 1 0.000 0.000 0.000 0.000 base_events.py:784(call_soon)\n", + " 1 0.000 0.000 0.000 0.000 builtin_trap.py:46(__enter__)\n", + " 1 0.000 0.000 0.000 0.000 asyncio.py:206(_handle_events)\n", + " 10 0.000 0.000 0.000 0.000 inspect.py:2808(kind)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method posix.getppid}\n", + " 2 0.000 0.000 0.000 0.000 {method 'write' of '_io.StringIO' objects}\n", + " 2 0.000 0.000 0.000 0.000 history.py:1065(hold)\n", + " 2 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.lock' objects}\n", + " 1 0.000 0.000 0.000 0.000 base_events.py:1900(_add_callback)\n", + " 2 0.000 0.000 0.000 0.000 queue.py:209(_qsize)\n", + " 1 0.000 0.000 0.000 0.000 syspathcontext.py:8(__init__)\n", + " 2 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects}\n", + " 2 0.000 0.000 0.000 0.000 {built-in method builtins.iter}\n", + " 1 0.000 0.000 0.000 0.000 {method 'partition' of 'str' objects}\n", + " 4 0.000 0.000 0.000 0.000 zmqstream.py:528(receiving)\n", + " 4 0.000 0.000 0.000 0.000 {built-in method builtins.hash}\n", + " 1 0.000 0.000 0.000 0.000 events.py:72(cancel)\n", + " 1 0.000 0.000 0.000 0.000 threading.py:314(_is_owned)\n", + " 4 0.000 0.000 0.000 0.000 inspect.py:2796(name)\n", + " 2 0.000 0.000 0.000 0.000 {built-in method time.time}\n", + " 5 0.000 0.000 0.000 0.000 pathlib.py:569(_tail)\n", + " 1 0.000 0.000 0.000 0.000 selectors.py:275(_key_from_fd)\n", + " 1 0.000 0.000 0.000 0.000 {method 'remove' of 'list' objects}\n", + " 2 0.000 0.000 0.000 0.000 {built-in method posix.getpid}\n", + " 1 0.000 0.000 0.000 0.000 {method 'insert' of 'list' objects}\n", + " 2 0.000 0.000 0.000 0.000 {method 'get' of '_contextvars.ContextVar' objects}\n", + " 2 0.000 0.000 0.000 0.000 {built-in method builtins.any}\n", + " 4 0.000 0.000 0.000 0.000 pathlib.py:560(root)\n", + " 4 0.000 0.000 0.000 0.000 inspect.py:3089(parameters)\n", + " 3 0.000 0.000 0.000 0.000 base_events.py:538(_check_closed)\n", + " 1 0.000 0.000 0.000 0.000 inspect.py:2888(__init__)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method _stat.S_ISLNK}\n", + " 4 0.000 0.000 0.000 0.000 threading.py:601(is_set)\n", + " 5 0.000 0.000 0.000 0.000 base_events.py:2010(get_debug)\n", + " 1 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects}\n", + " 1 0.000 0.000 0.000 0.000 {method 'release' of '_thread.lock' objects}\n", + " 2 0.000 0.000 0.000 0.000 displaypub.py:172(is_publishing)\n", + " 1 0.000 0.000 0.000 0.000 events.py:127(__lt__)\n", + " 1 0.000 0.000 0.000 0.000 tz.py:74(utcoffset)\n", + " 1 0.000 0.000 0.000 0.000 :2(__init__)\n", + " 1 0.000 0.000 0.000 0.000 {method 'cancelled' of '_asyncio.Future' objects}\n", + " 2 0.000 0.000 0.000 0.000 displayhook.py:118(is_active)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method _asyncio.get_running_loop}\n", + " 1 0.000 0.000 0.000 0.000 base_events.py:1910(_timer_handle_cancelled)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%run -p citation_network_slow.py" + ] + }, + { + "cell_type": "markdown", + "id": "3c67c5fc-bacc-477c-b193-dae66aeb9c1b", + "metadata": {}, + "source": [ + "**Note** Changed the data structure from `{str: list}` to `{str: set}`" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "d0a40bf7-9172-478a-a75d-4a0dc34a4c7b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 0.0% 0\n", + " 10.0% 0\n", + " 20.0% 1\n", + " 30.0% 1\n", + " 40.0% 3\n", + " 50.0% 4\n", + " 60.0% 6\n", + " 70.0% 9\n", + " 80.0% 15\n", + " 90.0% 29\n", + "100.0% 2414\n", + " " + ] + }, + { + "data": { + "text/plain": [ + " 1100898 function calls (1100891 primitive calls) in 0.373 seconds\n", + "\n", + " Ordered by: internal time\n", + "\n", + " ncalls tottime percall cumtime percall filename:lineno(function)\n", + " 1 0.154 0.154 0.207 0.207 citation_network_fix.py:37(load_citations)\n", + " 1 0.110 0.110 0.134 0.134 citation_network_fix.py:53(build_index)\n", + " 352809 0.031 0.000 0.031 0.000 {method 'split' of 'str' objects}\n", + " 352807 0.023 0.000 0.023 0.000 {method 'add' of 'set' objects}\n", + " 352825 0.018 0.000 0.018 0.000 {method 'append' of 'list' objects}\n", + " 1 0.015 0.015 0.365 0.365 citation_network_fix.py:1()\n", + " 1 0.005 0.005 0.005 0.005 {built-in method builtins.sorted}\n", + " 1 0.003 0.003 0.004 0.004 citation_network_fix.py:74(citation_counts)\n", + " 1 0.003 0.003 0.370 0.370 base_events.py:1915(_run_once)\n", + " 1160 0.002 0.000 0.004 0.000 ipkernel.py:797(_clean_thread_parent_frames)\n", + " 1 0.001 0.001 0.001 0.001 {built-in method builtins.compile}\n", + " 682 0.001 0.000 0.001 0.000 {built-in method _codecs.ascii_decode}\n", + " 2/1 0.001 0.000 0.371 0.371 {built-in method builtins.exec}\n", + " 27797 0.001 0.000 0.001 0.000 {built-in method builtins.len}\n", + " 5800 0.001 0.000 0.001 0.000 threading.py:1198(ident)\n", + " 580 0.001 0.000 0.001 0.000 threading.py:1535(enumerate)\n", + " 1 0.000 0.000 0.351 0.351 citation_network_fix.py:118(main)\n", + " 3 0.000 0.000 0.000 0.000 {built-in method _io.open}\n", + " 9 0.000 0.000 0.000 0.000 {built-in method sys.intern}\n", + " 1 0.000 0.000 0.000 0.000 pathlib.py:420(_from_parsed_parts)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method posix.getcwd}\n", + " 1 0.000 0.000 0.000 0.000 {method 'read' of '_io.BufferedReader' objects}\n", + " 2320 0.000 0.000 0.000 0.000 {method 'keys' of 'dict' objects}\n", + " 682 0.000 0.000 0.001 0.000 ascii.py:25(decode)\n", + " 2 0.000 0.000 0.000 0.000 enum.py:1545(__or__)\n", + " 4 0.000 0.000 0.000 0.000 attrsettr.py:66(_get_attr_opt)\n", + " 1160 0.000 0.000 0.000 0.000 {method 'values' of 'dict' objects}\n", + " 2 0.000 0.000 0.001 0.000 zmqstream.py:573(_handle_events)\n", + " 6 0.000 0.000 0.000 0.000 enum.py:1556(__and__)\n", + "1234/1230 0.000 0.000 0.000 0.000 {built-in method builtins.isinstance}\n", + " 2 0.000 0.000 0.000 0.000 pathlib.py:387(_parse_path)\n", + " 582 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.RLock' objects}\n", + " 1 0.000 0.000 0.005 0.005 citation_network_fix.py:83(get_percentiles)\n", + " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", + " 1 0.000 0.000 0.000 0.000 socket.py:623(send)\n", + " 2 0.000 0.000 0.000 0.000 pathlib.py:380(with_segments)\n", + " 3 0.000 0.000 0.000 0.000 pathlib.py:1164(__new__)\n", + " 3 0.000 0.000 0.000 0.000 {method '__exit__' of '_io._IOBase' objects}\n", + " 6 0.000 0.000 0.000 0.000 pathlib.py:437(__str__)\n", + " 5 0.000 0.000 0.000 0.000 pathlib.py:447(__fspath__)\n", + " 1 0.000 0.000 0.000 0.000 :408(abspath)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:3631(set)\n", + " 4 0.000 0.000 0.000 0.000 pathlib.py:551(drive)\n", + " 2 0.000 0.000 0.000 0.000 pathlib.py:407(_load_parts)\n", + " 2 0.000 0.000 0.000 0.000 {method '__exit__' of 'sqlite3.Connection' objects}\n", + " 2 0.000 0.000 0.000 0.000 iostream.py:662(write)\n", + " 1 0.000 0.000 0.367 0.367 {method 'control' of 'select.kqueue' objects}\n", + " 4 0.000 0.000 0.000 0.000 attrsettr.py:43(__getattr__)\n", + " 6 0.000 0.000 0.000 0.000 typing.py:392(inner)\n", + " 2 0.000 0.000 0.000 0.000 socket.py:771(recv_multipart)\n", + " 3 0.000 0.000 0.000 0.000 pathlib.py:429(_format_parsed_parts)\n", + " 2 0.000 0.000 0.000 0.000 :71(join)\n", + " 2 0.000 0.000 0.000 0.000 zmqstream.py:653(_rebuild_io_state)\n", + " 2 0.000 0.000 0.000 0.000 interactiveshell.py:3043(write)\n", + " 3 0.000 0.000 0.000 0.000 pathlib.py:358(__init__)\n", + " 3 0.000 0.000 0.000 0.000 pathlib.py:1157(__init__)\n", + " 1 0.000 0.000 0.000 0.000 syspathcontext.py:11(__enter__)\n", + " 14 0.000 0.000 0.000 0.000 enum.py:720(__call__)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:718(_validate)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method posix.stat}\n", + " 1 0.000 0.000 0.000 0.000 threading.py:308(_release_save)\n", + " 1 0.000 0.000 0.367 0.367 selectors.py:558(select)\n", + " 1 0.000 0.000 0.000 0.000 base_events.py:766(call_at)\n", + " 1 0.000 0.000 0.000 0.000 pathlib.py:1228(resolve)\n", + " 24 0.000 0.000 0.000 0.000 enum.py:1538(_get_value)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method posix.lstat}\n", + " 11 0.000 0.000 0.000 0.000 citation_network_fix.py:98(value_at_rank)\n", + " 1 0.000 0.000 0.000 0.000 citation_network_fix.py:110(make_percentiles_table)\n", + " 5 0.000 0.000 0.000 0.000 base_events.py:733(time)\n", + " 1 0.000 0.000 0.000 0.000 traitlets.py:1527(_notify_observers)\n", + " 11 0.000 0.000 0.000 0.000 {method 'format' of 'str' objects}\n", + " 1 0.000 0.000 0.000 0.000 interactiveshell.py:2878(safe_execfile)\n", + " 2 0.000 0.000 0.000 0.000 ioloop.py:549(time)\n", + " 9 0.000 0.000 0.000 0.000 {built-in method builtins.hasattr}\n", + " 1 0.000 0.000 0.000 0.000 events.py:111(__init__)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method builtins.print}\n", + " 1 0.000 0.000 0.000 0.000 ioloop.py:604(call_later)\n", + " 1 0.000 0.000 0.000 0.000 events.py:36(__init__)\n", + " 1 0.000 0.000 0.000 0.000 pathlib.py:1398(expanduser)\n", + " 2 0.000 0.000 0.000 0.000 queue.py:97(empty)\n", + " 6 0.000 0.000 0.000 0.000 traitlets.py:676(__get__)\n", + " 1 0.000 0.000 0.000 0.000 :432(_joinrealpath)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:3474(validate)\n", + " 2 0.000 0.000 0.001 0.000 events.py:86(_run)\n", + " 1 0.000 0.000 0.000 0.000 :260(__init__)\n", + " 2 0.000 0.000 0.000 0.000 zmqstream.py:614(_handle_recv)\n", + " 2 0.000 0.000 0.000 0.000 :138(splitroot)\n", + " 1 0.000 0.000 0.000 0.000 threading.py:1222(is_alive)\n", + " 14 0.000 0.000 0.000 0.000 enum.py:1123(__new__)\n", + " 4 0.000 0.000 0.000 0.000 :1390(_handle_fromlist)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method builtins.next}\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:689(set)\n", + " 4 0.000 0.000 0.000 0.000 typing.py:1285(__hash__)\n", + " 1 0.000 0.000 0.000 0.000 iostream.py:260(schedule)\n", + " 1 0.000 0.000 0.000 0.000 asyncio.py:216(call_at)\n", + " 12/11 0.000 0.000 0.000 0.000 {built-in method posix.fspath}\n", + " 2 0.000 0.000 0.000 0.000 {built-in method builtins.issubclass}\n", + " 2 0.000 0.000 0.001 0.000 {method 'run' of '_contextvars.Context' objects}\n", + " 4 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}\n", + " 1 0.000 0.000 0.000 0.000 py3compat.py:52(execfile)\n", + " 2 0.000 0.000 0.000 0.000 selector_events.py:750(_process_events)\n", + " 1 0.000 0.000 0.001 0.001 zmqstream.py:684()\n", + " 5 0.000 0.000 0.000 0.000 {method 'startswith' of 'str' objects}\n", + " 1 0.000 0.000 0.000 0.000 base_events.py:742(call_later)\n", + " 6 0.000 0.000 0.000 0.000 traitlets.py:629(get)\n", + " 4 0.000 0.000 0.000 0.000 {built-in method builtins.getattr}\n", + " 3 0.000 0.000 0.000 0.000 {built-in method __new__ of type object at 0x101e64a30}\n", + " 1 0.000 0.000 0.000 0.000 contextlib.py:141(__exit__)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:3624(validate_elements)\n", + " 2 0.000 0.000 0.000 0.000 :60(isabs)\n", + " 2 0.000 0.000 0.000 0.000 zmqstream.py:546(_run_callback)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:708(__set__)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:727(_cross_validate)\n", + " 2 0.000 0.000 0.000 0.000 typing.py:1492(__subclasscheck__)\n", + " 1 0.000 0.000 0.000 0.000 :423(realpath)\n", + " 1 0.000 0.000 0.000 0.000 traitlets.py:1512(_notify_trait)\n", + " 2 0.000 0.000 0.000 0.000 iostream.py:158(_handle_event)\n", + " 1 0.000 0.000 0.000 0.000 traitlets.py:1523(notify_change)\n", + " 1 0.000 0.000 0.000 0.000 :1()\n", + " 2 0.000 0.000 0.000 0.000 zmqstream.py:676(_update_handler)\n", + " 4 0.000 0.000 0.000 0.000 :41(_get_sep)\n", + " 2 0.000 0.000 0.000 0.000 typing.py:1221(__instancecheck__)\n", + " 2 0.000 0.000 0.000 0.000 {built-in method _abc._abc_subclasscheck}\n", + " 1 0.000 0.000 0.001 0.001 ioloop.py:750(_run_callback)\n", + " 5 0.000 0.000 0.000 0.000 {built-in method builtins.max}\n", + " 3/2 0.000 0.000 0.000 0.000 {method 'acquire' of '_thread.lock' objects}\n", + " 1 0.000 0.000 0.000 0.000 iostream.py:139(_event_pipe)\n", + " 2 0.000 0.000 0.000 0.000 :121(__subclasscheck__)\n", + " 2 0.000 0.000 0.000 0.000 iostream.py:512(parent_header)\n", + " 1 0.000 0.000 0.000 0.000 pathlib.py:1005(open)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method posix._path_normpath}\n", + " 1 0.000 0.000 0.000 0.000 pathlib.py:731(parent)\n", + " 2 0.000 0.000 0.000 0.000 iostream.py:584(_schedule_flush)\n", + " 1 0.000 0.000 0.000 0.000 builtin_trap.py:53(__exit__)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:2304(validate)\n", + " 1 0.000 0.000 0.000 0.000 history.py:1016(_writeout_output_cache)\n", + " 2 0.000 0.000 0.000 0.000 iostream.py:557(_is_master_process)\n", + " 2 0.000 0.000 0.000 0.000 zmqstream.py:532(sending)\n", + " 1 0.000 0.000 0.000 0.000 pathlib.py:835(stat)\n", + " 24 0.000 0.000 0.000 0.000 typing.py:2183(cast)\n", + " 5 0.000 0.000 0.000 0.000 {built-in method time.monotonic}\n", + " 3 0.000 0.000 0.000 0.000 {method 'append' of 'collections.deque' objects}\n", + " 1 0.000 0.000 0.000 0.000 threading.py:299(__enter__)\n", + " 1 0.000 0.000 0.000 0.000 syspathcontext.py:18(__exit__)\n", + " 1 0.000 0.000 0.000 0.000 iostream.py:594(_schedule_in_thread)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method _contextvars.copy_context}\n", + " 4 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects}\n", + " 2 0.000 0.000 0.000 0.000 queue.py:209(_qsize)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method _heapq.heappush}\n", + " 1 0.000 0.000 0.000 0.000 threading.py:601(is_set)\n", + " 1 0.000 0.000 0.000 0.000 threading.py:314(_is_owned)\n", + " 1 0.000 0.000 0.000 0.000 builtin_trap.py:46(__enter__)\n", + " 4 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:3486(validate_elements)\n", + " 4 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.lock' objects}\n", + " 1 0.000 0.000 0.000 0.000 :131(splitdrive)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method _thread.allocate_lock}\n", + " 1 0.000 0.000 0.000 0.000 {method 'partition' of 'str' objects}\n", + " 2 0.000 0.000 0.000 0.000 {built-in method builtins.min}\n", + " 3 0.000 0.000 0.000 0.000 {method 'popleft' of 'collections.deque' objects}\n", + " 1 0.000 0.000 0.000 0.000 base_events.py:1900(_add_callback)\n", + " 1 0.000 0.000 0.000 0.000 asyncio.py:206(_handle_events)\n", + " 5 0.000 0.000 0.000 0.000 pathlib.py:569(_tail)\n", + " 3 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects}\n", + " 4 0.000 0.000 0.000 0.000 pathlib.py:560(root)\n", + " 2 0.000 0.000 0.000 0.000 {method 'write' of '_io.StringIO' objects}\n", + " 4 0.000 0.000 0.000 0.000 zmqstream.py:528(receiving)\n", + " 1 0.000 0.000 0.000 0.000 {method 'remove' of 'list' objects}\n", + " 2 0.000 0.000 0.000 0.000 {built-in method builtins.any}\n", + " 4 0.000 0.000 0.000 0.000 {built-in method builtins.hash}\n", + " 2 0.000 0.000 0.000 0.000 {method 'get' of '_contextvars.ContextVar' objects}\n", + " 1 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects}\n", + " 2 0.000 0.000 0.000 0.000 {built-in method posix.getpid}\n", + " 1 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.lock' objects}\n", + " 1 0.000 0.000 0.000 0.000 tz.py:74(utcoffset)\n", + " 1 0.000 0.000 0.000 0.000 {method 'insert' of 'list' objects}\n", + " 1 0.000 0.000 0.000 0.000 threading.py:1155(_wait_for_tstate_lock)\n", + " 2 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects}\n", + " 2 0.000 0.000 0.000 0.000 {built-in method time.time}\n", + " 1 0.000 0.000 0.000 0.000 {built-in method _stat.S_ISLNK}\n", + " 1 0.000 0.000 0.000 0.000 events.py:127(__lt__)\n", + " 1 0.000 0.000 0.000 0.000 {method 'release' of '_thread.lock' objects}\n", + " 1 0.000 0.000 0.000 0.000 :2(__init__)\n", + " 1 0.000 0.000 0.000 0.000 syspathcontext.py:8(__init__)\n", + " 1 0.000 0.000 0.000 0.000 history.py:1065(hold)\n", + " 1 0.000 0.000 0.000 0.000 selectors.py:275(_key_from_fd)\n", + " 2 0.000 0.000 0.000 0.000 displayhook.py:118(is_active)\n", + " 2 0.000 0.000 0.000 0.000 displaypub.py:172(is_publishing)\n", + " 1 0.000 0.000 0.000 0.000 base_events.py:538(_check_closed)\n", + " 1 0.000 0.000 0.000 0.000 base_events.py:2010(get_debug)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%run -p citation_network_fix.py" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "d9bf9a89-462e-4708-9e71-153f4ca29ea6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.22916666666666666" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(.48 - .37) / .48" + ] + }, + { + "cell_type": "markdown", + "id": "294bb35e-c488-43e2-a758-a14416b41c99", + "metadata": {}, + "source": [ + "# Debugging" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "a71c6680-8579-4974-a607-d62d1038fbb3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'/Users/timdiller/Documents/Diller_Digital_SWNG/demo/Software_Engineering/citation_network'" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pwd" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "6fef30a7-8327-40e7-a323-99ae4a5541b4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/timdiller/Documents/Diller_Digital_SWNG/demo/Software_Engineering\n" + ] + } + ], + "source": [ + "cd .." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "3249b929-6df3-41f4-bb45-23fc3b3e70bb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/timdiller/Documents/Diller_Digital_SWNG/demo/pdb\n" + ] + } + ], + "source": [ + "cd ../pdb/" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "4d4d55fe-b583-4f50-89b7-a9be3bed73db", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dir.dat file_sum.py middle.py README.rst\n" + ] + } + ], + "source": [ + "ls" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "0eb1b3c7-331a-421e-9a99-c732229b41a1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Automatic pdb calling has been turned ON\n" + ] + } + ], + "source": [ + "%pdb" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "d640dd19-a884-4493-8290-968554254800", + "metadata": {}, + "outputs": [], + "source": [ + "import middle" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "f7a2ad78-4cca-4d56-956d-10d396cdc5d9", + "metadata": {}, + "outputs": [ + { + "ename": "IndexError", + "evalue": "list index out of range", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mIndexError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[44]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43mmiddle\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/Diller_Digital_SWNG/demo/pdb/middle.py:35\u001b[39m, in \u001b[36mrun\u001b[39m\u001b[34m()\u001b[39m\n\u001b[32m 33\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[32m1\u001b[39m, \u001b[32m11\u001b[39m):\n\u001b[32m 34\u001b[39m list_of_length_i = make_list(i)\n\u001b[32m---> \u001b[39m\u001b[32m35\u001b[39m middle = \u001b[43mget_middle\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlist_of_length_i\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 36\u001b[39m template = \u001b[33m\"\u001b[39m\u001b[33mThe middle item(s) in \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\t\u001b[39;00m\u001b[33mis/are \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 37\u001b[39m \u001b[38;5;28mprint\u001b[39m(template.format(list_of_length_i, middle))\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/Diller_Digital_SWNG/demo/pdb/middle.py:10\u001b[39m, in \u001b[36mget_middle\u001b[39m\u001b[34m(item_list)\u001b[39m\n\u001b[32m 7\u001b[39m half = num_items * \u001b[32m2\u001b[39m\n\u001b[32m 9\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m num_items % \u001b[32m2\u001b[39m:\n\u001b[32m---> \u001b[39m\u001b[32m10\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mitem_list\u001b[49m\u001b[43m[\u001b[49m\u001b[43mhalf\u001b[49m\u001b[43m]\u001b[49m\n\u001b[32m 12\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m item_list[(half - \u001b[32m1\u001b[39m):(half + \u001b[32m1\u001b[39m)]\n", + "\u001b[31mIndexError\u001b[39m: list index out of range" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> \u001b[32m/Users/timdiller/Documents/Diller_Digital_SWNG/demo/pdb/middle.py\u001b[39m(\u001b[92m10\u001b[39m)\u001b[36mget_middle\u001b[39m\u001b[34m()\u001b[39m\n", + "\u001b[32m 8\u001b[39m \n", + "\u001b[32m 9\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m num_items % \u001b[32m2\u001b[39m:\n", + "\u001b[32m---> 10\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m item_list[half]\n", + "\u001b[32m 11\u001b[39m \n", + "\u001b[32m 12\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m item_list[(half - \u001b[32m1\u001b[39m):(half + \u001b[32m1\u001b[39m)]\n", + "\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> half\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> len(item_list)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> ?\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Object `` not found.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> h\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Documented commands (type help ):\n", + "========================================\n", + "EOF cont help p return undisplay \n", + "a context ignore pdef retval unignore_module\n", + "alias continue ignore_module pdoc run unt \n", + "args d interact pfile rv until \n", + "b debug j pinfo s up \n", + "break disable jump pinfo2 skip_hidden w \n", + "bt display l pp skip_predicates whatis \n", + "c down list psource source where \n", + "cl enable ll q step \n", + "clear exceptions longlist quit tbreak \n", + "commands exit n r u \n", + "condition h next restart unalias \n", + "\n", + "Miscellaneous help topics:\n", + "==========================\n", + "exec pdb\n", + "\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> l\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[92m 5\u001b[39m \"\"\"\n", + "\u001b[92m 6\u001b[39m num_items = len(item_list)\n", + "\u001b[92m 7\u001b[39m half = num_items * \u001b[32m2\u001b[39m\n", + "\u001b[92m 8\u001b[39m \n", + "\u001b[92m 9\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m num_items % \u001b[32m2\u001b[39m:\n", + "\u001b[32m---> 10\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m item_list[half]\n", + "\u001b[92m 11\u001b[39m \n", + "\u001b[92m 12\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m item_list[(half - \u001b[32m1\u001b[39m):(half + \u001b[32m1\u001b[39m)]\n", + "\u001b[92m 13\u001b[39m \n", + "\u001b[92m 14\u001b[39m \n", + "\u001b[92m 15\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m make_list(size=\u001b[32m0\u001b[39m):\n", + "\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> half = num_items / 2\n", + "ipdb> item_list[half]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "*** TypeError: list indices must be integers or slices, not float\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> half = num_items // 2\n", + "ipdb> item_list[half]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'0'\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> args\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "item_list = ['0']\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> where\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[31m [... skipping 1 hidden frame(s)]\u001b[39m\n", + " \u001b[32m/var/folders/4p/zx544knx2qzgc26tg4g508gm0000gn/T/ipykernel_16438/4003336241.py\u001b[39m(\u001b[92m1\u001b[39m)\u001b[36m\u001b[39m\u001b[34m()\u001b[39m\n", + "\u001b[32m----> 1\u001b[39m middle.run()\n", + " \u001b[32m/Users/timdiller/Documents/Diller_Digital_SWNG/demo/pdb/middle.py\u001b[39m(\u001b[92m35\u001b[39m)\u001b[36mrun\u001b[39m\u001b[34m()\u001b[39m\n", + "\u001b[92m 33\u001b[39m \u001b[31m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;28;01min\u001b[39;00m range(\u001b[32m1\u001b[39m, \u001b[32m11\u001b[39m):\u001b[39m\n", + "\u001b[92m 34\u001b[39m \u001b[31m list_of_length_i = make_list(i)\u001b[39m\n", + "\u001b[32m---> 35\u001b[39m middle = get_middle(list_of_length_i)\n", + "\u001b[92m 36\u001b[39m \u001b[31m template = \u001b[33m\"The middle item(s) in {}\\n\\tis/are {}\\n\"\u001b[39m\u001b[39m\n", + "\u001b[92m 37\u001b[39m \u001b[31m print(template.format(list_of_length_i, middle))\u001b[39m\n", + "> \u001b[32m/Users/timdiller/Documents/Diller_Digital_SWNG/demo/pdb/middle.py\u001b[39m(\u001b[92m10\u001b[39m)\u001b[36mget_middle\u001b[39m\u001b[34m()\u001b[39m\n", + "\u001b[32m 8\u001b[39m \n", + "\u001b[32m 9\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m num_items % \u001b[32m2\u001b[39m:\n", + "\u001b[32m---> 10\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m item_list[half]\n", + "\u001b[32m 11\u001b[39m \n", + "\u001b[32m 12\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m item_list[(half - \u001b[32m1\u001b[39m):(half + \u001b[32m1\u001b[39m)]\n", + "\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> up\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> \u001b[32m/Users/timdiller/Documents/Diller_Digital_SWNG/demo/pdb/middle.py\u001b[39m(\u001b[92m35\u001b[39m)\u001b[36mrun\u001b[39m\u001b[34m()\u001b[39m\n", + "\u001b[32m 33\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;28;01min\u001b[39;00m range(\u001b[32m1\u001b[39m, \u001b[32m11\u001b[39m):\n", + "\u001b[32m 34\u001b[39m list_of_length_i = make_list(i)\n", + "\u001b[32m---> 35\u001b[39m middle = get_middle(list_of_length_i)\n", + "\u001b[32m 36\u001b[39m template = \u001b[33m\"The middle item(s) in {}\\n\\tis/are {}\\n\"\u001b[39m\n", + "\u001b[32m 37\u001b[39m print(template.format(list_of_length_i, middle))\n", + "\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> list_of_length_i\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['0']\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> where\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[31m [... skipping 1 hidden frame(s)]\u001b[39m\n", + " \u001b[32m/var/folders/4p/zx544knx2qzgc26tg4g508gm0000gn/T/ipykernel_16438/4003336241.py\u001b[39m(\u001b[92m1\u001b[39m)\u001b[36m\u001b[39m\u001b[34m()\u001b[39m\n", + "\u001b[32m----> 1\u001b[39m middle.run()\n", + "> \u001b[32m/Users/timdiller/Documents/Diller_Digital_SWNG/demo/pdb/middle.py\u001b[39m(\u001b[92m35\u001b[39m)\u001b[36mrun\u001b[39m\u001b[34m()\u001b[39m\n", + "\u001b[32m 33\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;28;01min\u001b[39;00m range(\u001b[32m1\u001b[39m, \u001b[32m11\u001b[39m):\n", + "\u001b[32m 34\u001b[39m list_of_length_i = make_list(i)\n", + "\u001b[32m---> 35\u001b[39m middle = get_middle(list_of_length_i)\n", + "\u001b[32m 36\u001b[39m template = \u001b[33m\"The middle item(s) in {}\\n\\tis/are {}\\n\"\u001b[39m\n", + "\u001b[32m 37\u001b[39m print(template.format(list_of_length_i, middle))\n", + " \u001b[32m/Users/timdiller/Documents/Diller_Digital_SWNG/demo/pdb/middle.py\u001b[39m(\u001b[92m10\u001b[39m)\u001b[36mget_middle\u001b[39m\u001b[34m()\u001b[39m\n", + "\u001b[92m 8\u001b[39m \n", + "\u001b[92m 9\u001b[39m \u001b[31m \u001b[38;5;28;01mif\u001b[39;00m num_items % \u001b[32m2\u001b[39m:\u001b[39m\n", + "\u001b[32m---> 10\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m item_list[half]\n", + "\u001b[92m 11\u001b[39m \n", + "\u001b[92m 12\u001b[39m \u001b[31m \u001b[38;5;28;01mreturn\u001b[39;00m item_list[(half - \u001b[32m1\u001b[39m):(half + \u001b[32m1\u001b[39m)]\u001b[39m\n", + "\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> down\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> \u001b[32m/Users/timdiller/Documents/Diller_Digital_SWNG/demo/pdb/middle.py\u001b[39m(\u001b[92m10\u001b[39m)\u001b[36mget_middle\u001b[39m\u001b[34m()\u001b[39m\n", + "\u001b[32m 8\u001b[39m \n", + "\u001b[32m 9\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m num_items % \u001b[32m2\u001b[39m:\n", + "\u001b[32m---> 10\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m item_list[half]\n", + "\u001b[32m 11\u001b[39m \n", + "\u001b[32m 12\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m item_list[(half - \u001b[32m1\u001b[39m):(half + \u001b[32m1\u001b[39m)]\n", + "\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> help\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Documented commands (type help ):\n", + "========================================\n", + "EOF cont help p return undisplay \n", + "a context ignore pdef retval unignore_module\n", + "alias continue ignore_module pdoc run unt \n", + "args d interact pfile rv until \n", + "b debug j pinfo s up \n", + "break disable jump pinfo2 skip_hidden w \n", + "bt display l pp skip_predicates whatis \n", + "c down list psource source where \n", + "cl enable ll q step \n", + "clear exceptions longlist quit tbreak \n", + "commands exit n r u \n", + "condition h next restart unalias \n", + "\n", + "Miscellaneous help topics:\n", + "==========================\n", + "exec pdb\n", + "\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> list\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[92m 5\u001b[39m \"\"\"\n", + "\u001b[92m 6\u001b[39m num_items = len(item_list)\n", + "\u001b[92m 7\u001b[39m half = num_items * \u001b[32m2\u001b[39m\n", + "\u001b[92m 8\u001b[39m \n", + "\u001b[92m 9\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m num_items % \u001b[32m2\u001b[39m:\n", + "\u001b[32m---> 10\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m item_list[half]\n", + "\u001b[92m 11\u001b[39m \n", + "\u001b[92m 12\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m item_list[(half - \u001b[32m1\u001b[39m):(half + \u001b[32m1\u001b[39m)]\n", + "\u001b[92m 13\u001b[39m \n", + "\u001b[92m 14\u001b[39m \n", + "\u001b[92m 15\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m make_list(size=\u001b[32m0\u001b[39m):\n", + "\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> next\n" + ] + } + ], + "source": [ + "middle.run()" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "62892f9d-9f93-4270-8031-5ae75e518788", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from importlib import reload\n", + "reload(middle)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "9b28f7a4-1c2c-4560-9aa9-685150466c85", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The middle item(s) in ['0']\n", + "\tis/are 0\n", + "\n", + "The middle item(s) in ['0', '1']\n", + "\tis/are ['0', '1']\n", + "\n", + "The middle item(s) in ['0', '1', '2']\n", + "\tis/are 1\n", + "\n", + "The middle item(s) in ['0', '1', '2', '3']\n", + "\tis/are ['1', '2']\n", + "\n", + "The middle item(s) in ['0', '1', '2', '3', '4']\n", + "\tis/are 2\n", + "\n", + "The middle item(s) in ['0', '1', '2', '3', '4', '5']\n", + "\tis/are ['2', '3']\n", + "\n", + "The middle item(s) in ['0', '1', '2', '3', '4', '5', '6']\n", + "\tis/are 3\n", + "\n", + "The middle item(s) in ['0', '1', '2', '3', '4', '5', '6', '7']\n", + "\tis/are ['3', '4']\n", + "\n", + "The middle item(s) in ['0', '1', '2', '3', '4', '5', '6', '7', '8']\n", + "\tis/are 4\n", + "\n", + "The middle item(s) in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']\n", + "\tis/are ['4', '5']\n", + "\n" + ] + } + ], + "source": [ + "middle.run()" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "a55db015-7338-4673-83c4-27a4620b8bbc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'__name__': '__main__',\n", + " '__doc__': 'Module created for script run in IPython',\n", + " '__package__': None,\n", + " '__loader__': None,\n", + " '__spec__': None,\n", + " '__builtin__': ,\n", + " '__builtins__': ,\n", + " '_ih': ['',\n", + " \"get_ipython().run_line_magic('run', 'live_coding/lecture05.py')\",\n", + " \"get_ipython().run_line_magic('whos', '')\",\n", + " \"get_ipython().run_line_magic('pinfo2', 'test_logging')\",\n", + " 'test_logg()',\n", + " 'test_logging()',\n", + " 'import logging\\nlogging.basicConfig(level=logging.INFO)',\n", + " 'test_logging()',\n", + " 'import logging\\nlogging.basicConfig(level=logging.INFO, force=True)',\n", + " 'test_logging()',\n", + " 'logger = logging.getLogger()',\n", + " 'logger',\n", + " 'logger.setLevel(logging.ERROR)\\ntest_logging()',\n", + " 'logger.setLevel(logging.NOTSET)\\ntest_logging()',\n", + " 'logger.info(\"Hello my name is Inigo\")',\n", + " 'logger.handlers',\n", + " 'h = logger.handlers[0]\\nh',\n", + " 'h.setLevel(logging.ERROR)',\n", + " 'logger.info(\"Hello\")',\n", + " 'h.formatter',\n", + " 'f = h.formatter',\n", + " 'f.format',\n", + " 'f2 = logging.Formatter(\\'%(asctime)s:%(funcName)s() - %(message)\\')\\nh.setFormatter(f2)\\nlogger.critical(\"Help Help\")',\n", + " 'f2 = logging.Formatter(\\'%(asctime)s:%(funcName)s() - %(message)s\\')\\nh.setFormatter(f2)\\nlogger.critical(\"Help Help\")',\n", + " 'test_logging()',\n", + " 'logging.basicConfig(force=True)\\ntest_logging()',\n", + " '__name__',\n", + " 'logger = logging.getLogger(__name__)',\n", + " 'logger.warning(\"Hi\")',\n", + " 'import sys\\nh2 = logging.StreamHandler(sys.stdout)',\n", + " 'logger = logging.getLogger(__name__)\\nlogger.handlers.append(h2)',\n", + " 'logger.error(\"Hi\")',\n", + " \"get_ipython().run_line_magic('cd', 'demo/Software_Engineering/citation_network/')\",\n", + " \"get_ipython().run_line_magic('run', '-p citation_network_slow.py')\",\n", + " \"get_ipython().run_line_magic('run', '-p citation_network_fix.py')\",\n", + " '(.48 - .37) / .48',\n", + " \"get_ipython().run_line_magic('pwd', '')\",\n", + " \"get_ipython().run_line_magic('cd', '..')\",\n", + " \"get_ipython().run_line_magic('cd', '../pdb/')\",\n", + " \"get_ipython().run_line_magic('ls', '')\",\n", + " \"get_ipython().run_line_magic('debug', '')\",\n", + " \"get_ipython().run_line_magic('pdb', '')\",\n", + " \"get_ipython().run_line_magic('run', 'middle.py')\",\n", + " 'import middle',\n", + " 'middle.run()',\n", + " 'from importlib import reload\\nreload(middle)',\n", + " 'middle.run()',\n", + " 'locals()'],\n", + " '_oh': {11: ,\n", + " 15: [],\n", + " 16: ,\n", + " 19: ,\n", + " 21: >,\n", + " 26: '__main__',\n", + " 35: 0.22916666666666666,\n", + " 36: '/Users/timdiller/Documents/Diller_Digital_SWNG/demo/Software_Engineering/citation_network',\n", + " 45: },\n", + " '_dh': [PosixPath('/Users/timdiller/Documents/Diller_Digital_SWNG'),\n", + " PosixPath('/Users/timdiller/Documents/Diller_Digital_SWNG/demo/Software_Engineering/citation_network'),\n", + " PosixPath('/Users/timdiller/Documents/Diller_Digital_SWNG/demo/Software_Engineering'),\n", + " PosixPath('/Users/timdiller/Documents/Diller_Digital_SWNG/demo/pdb')],\n", + " 'In': ['',\n", + " \"get_ipython().run_line_magic('run', 'live_coding/lecture05.py')\",\n", + " \"get_ipython().run_line_magic('whos', '')\",\n", + " \"get_ipython().run_line_magic('pinfo2', 'test_logging')\",\n", + " 'test_logg()',\n", + " 'test_logging()',\n", + " 'import logging\\nlogging.basicConfig(level=logging.INFO)',\n", + " 'test_logging()',\n", + " 'import logging\\nlogging.basicConfig(level=logging.INFO, force=True)',\n", + " 'test_logging()',\n", + " 'logger = logging.getLogger()',\n", + " 'logger',\n", + " 'logger.setLevel(logging.ERROR)\\ntest_logging()',\n", + " 'logger.setLevel(logging.NOTSET)\\ntest_logging()',\n", + " 'logger.info(\"Hello my name is Inigo\")',\n", + " 'logger.handlers',\n", + " 'h = logger.handlers[0]\\nh',\n", + " 'h.setLevel(logging.ERROR)',\n", + " 'logger.info(\"Hello\")',\n", + " 'h.formatter',\n", + " 'f = h.formatter',\n", + " 'f.format',\n", + " 'f2 = logging.Formatter(\\'%(asctime)s:%(funcName)s() - %(message)\\')\\nh.setFormatter(f2)\\nlogger.critical(\"Help Help\")',\n", + " 'f2 = logging.Formatter(\\'%(asctime)s:%(funcName)s() - %(message)s\\')\\nh.setFormatter(f2)\\nlogger.critical(\"Help Help\")',\n", + " 'test_logging()',\n", + " 'logging.basicConfig(force=True)\\ntest_logging()',\n", + " '__name__',\n", + " 'logger = logging.getLogger(__name__)',\n", + " 'logger.warning(\"Hi\")',\n", + " 'import sys\\nh2 = logging.StreamHandler(sys.stdout)',\n", + " 'logger = logging.getLogger(__name__)\\nlogger.handlers.append(h2)',\n", + " 'logger.error(\"Hi\")',\n", + " \"get_ipython().run_line_magic('cd', 'demo/Software_Engineering/citation_network/')\",\n", + " \"get_ipython().run_line_magic('run', '-p citation_network_slow.py')\",\n", + " \"get_ipython().run_line_magic('run', '-p citation_network_fix.py')\",\n", + " '(.48 - .37) / .48',\n", + " \"get_ipython().run_line_magic('pwd', '')\",\n", + " \"get_ipython().run_line_magic('cd', '..')\",\n", + " \"get_ipython().run_line_magic('cd', '../pdb/')\",\n", + " \"get_ipython().run_line_magic('ls', '')\",\n", + " \"get_ipython().run_line_magic('debug', '')\",\n", + " \"get_ipython().run_line_magic('pdb', '')\",\n", + " \"get_ipython().run_line_magic('run', 'middle.py')\",\n", + " 'import middle',\n", + " 'middle.run()',\n", + " 'from importlib import reload\\nreload(middle)',\n", + " 'middle.run()',\n", + " 'locals()'],\n", + " 'Out': {11: ,\n", + " 15: [],\n", + " 16: ,\n", + " 19: ,\n", + " 21: >,\n", + " 26: '__main__',\n", + " 35: 0.22916666666666666,\n", + " 36: '/Users/timdiller/Documents/Diller_Digital_SWNG/demo/Software_Engineering/citation_network',\n", + " 45: },\n", + " 'get_ipython': >,\n", + " 'exit': ,\n", + " 'quit': ,\n", + " 'open': ,\n", + " '_': ,\n", + " '__': '/Users/timdiller/Documents/Diller_Digital_SWNG/demo/Software_Engineering/citation_network',\n", + " '___': 0.22916666666666666,\n", + " '__session__': '/Users/timdiller/Documents/Diller_Digital_SWNG/Untitled.ipynb',\n", + " '_i': 'middle.run()',\n", + " '_ii': 'from importlib import reload\\nreload(middle)',\n", + " '_iii': 'middle.run()',\n", + " '_i1': '%run live_coding/lecture05.py',\n", + " '__nonzero__': .()>,\n", + " 'logging': ,\n", + " 'test_logging': ,\n", + " 'div': ,\n", + " '_i2': 'whos',\n", + " '_i3': 'test_logging??',\n", + " '_i4': 'test_logg()',\n", + " '_i5': 'test_logging()',\n", + " '_i6': 'import logging\\nlogging.basicConfig(level=logging.INFO)',\n", + " '_i7': 'test_logging()',\n", + " '_i8': 'import logging\\nlogging.basicConfig(level=logging.INFO, force=True)',\n", + " '_i9': 'test_logging()',\n", + " '_i10': 'logger = logging.getLogger()',\n", + " 'logger': ,\n", + " '_i11': 'logger',\n", + " '_11': ,\n", + " '_i12': 'logger.setLevel(logging.ERROR)\\ntest_logging()',\n", + " '_i13': 'logger.setLevel(logging.NOTSET)\\ntest_logging()',\n", + " '_i14': 'logger.info(\"Hello my name is Inigo\")',\n", + " '_i15': 'logger.handlers',\n", + " '_15': [],\n", + " '_i16': 'h = logger.handlers[0]\\nh',\n", + " 'h': ,\n", + " '_16': ,\n", + " '_i17': 'h.setLevel(logging.ERROR)',\n", + " '_i18': 'logger.info(\"Hello\")',\n", + " '_i19': 'h.formatter',\n", + " '_19': ,\n", + " '_i20': 'f = h.formatter',\n", + " 'f': ,\n", + " '_i21': 'f.format',\n", + " '_21': >,\n", + " '_i22': 'f2 = logging.Formatter(\\'%(asctime)s:%(funcName)s() - %(message)\\')\\nh.setFormatter(f2)\\nlogger.critical(\"Help Help\")',\n", + " 'f2': ,\n", + " '_i23': 'f2 = logging.Formatter(\\'%(asctime)s:%(funcName)s() - %(message)s\\')\\nh.setFormatter(f2)\\nlogger.critical(\"Help Help\")',\n", + " '_i24': 'test_logging()',\n", + " '_i25': 'logging.basicConfig(force=True)\\ntest_logging()',\n", + " '_i26': '__name__',\n", + " '_26': '__main__',\n", + " '_i27': 'logger = logging.getLogger(__name__)',\n", + " '_i28': 'logger.warning(\"Hi\")',\n", + " '_i29': 'import sys\\nh2 = logging.StreamHandler(sys.stdout)',\n", + " 'sys': ,\n", + " 'h2': ,\n", + " '_i30': 'logger = logging.getLogger(__name__)\\nlogger.handlers.append(h2)',\n", + " '_i31': 'logger.error(\"Hi\")',\n", + " '_i32': '%cd demo/Software_Engineering/citation_network/',\n", + " '_i33': '%run -p citation_network_slow.py',\n", + " 'load_citations': ,\n", + " 'build_index': ,\n", + " 'citation_counts': ,\n", + " 'get_percentiles': ,\n", + " 'value_at_rank': ,\n", + " 'make_percentiles_table': ,\n", + " 'main': ,\n", + " '_i34': '%run -p citation_network_fix.py',\n", + " '_i35': '(.48 - .37) / .48',\n", + " '_35': 0.22916666666666666,\n", + " '_i36': 'pwd',\n", + " '_36': '/Users/timdiller/Documents/Diller_Digital_SWNG/demo/Software_Engineering/citation_network',\n", + " '_i37': 'cd ..',\n", + " '_i38': 'cd ../pdb/',\n", + " '_i39': 'ls',\n", + " '_exit_code': 0,\n", + " '_i40': '%debug',\n", + " '_i41': '%pdb',\n", + " '_i42': '%run middle.py',\n", + " 'get_middle': ,\n", + " 'make_list': ,\n", + " 'run': ,\n", + " '_i43': 'import middle',\n", + " 'middle': ,\n", + " '_i44': 'middle.run()',\n", + " '_i45': 'from importlib import reload\\nreload(middle)',\n", + " 'reload': ,\n", + " '_45': ,\n", + " '_i46': 'middle.run()',\n", + " '_i47': 'locals()'}" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "locals()" + ] + }, + { + "cell_type": "markdown", + "id": "da1ada4c-dde6-4eb5-a0b1-f63ac5294190", + "metadata": {}, + "source": [ + "# Lecture 7 - Unit Testing" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "a31a99eb-20ff-4bff-8b1e-a86dd5dcc792", + "metadata": {}, + "outputs": [], + "source": [ + "def simple_div(a,b):\n", + " return a / b" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "622126db-8a6d-4971-b020-1be1b325b4a5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5.0" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simple_div(25,5)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "51b40fe1-6918-4405-bce6-6f4bb5e5bb22", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simple_div(25,5) == 5" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "16dc6859-ece8-4f97-8c9a-d877c3c73e4d", + "metadata": {}, + "outputs": [], + "source": [ + "assert True" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "ef15518b-aaf8-4cdf-afe1-5d96f6ea396b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Automatic pdb calling has been turned OFF\n" + ] + } + ], + "source": [ + "%pdb" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "a0886220-4b61-4ab0-bc04-8adae3604a88", + "metadata": {}, + "outputs": [ + { + "ename": "AssertionError", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mAssertionError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[55]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n", + "\u001b[31mAssertionError\u001b[39m: " + ] + } + ], + "source": [ + "assert False" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "2b4d383c-4708-4c33-9186-270ba5c4b6f1", + "metadata": {}, + "outputs": [ + { + "ename": "ZeroDivisionError", + "evalue": "division by zero", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mZeroDivisionError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[60]\u001b[39m\u001b[32m, line 3\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;28;01massert\u001b[39;00m simple_div(\u001b[32m25\u001b[39m,\u001b[32m5\u001b[39m) == \u001b[32m5\u001b[39m\n\u001b[32m 2\u001b[39m \u001b[38;5;28;01massert\u001b[39;00m simple_div(\u001b[32m1\u001b[39m, \u001b[32m3\u001b[39m) == \u001b[32m0.3333333333333333333\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m3\u001b[39m \u001b[38;5;28;01massert\u001b[39;00m \u001b[43msimple_div\u001b[49m\u001b[43m(\u001b[49m\u001b[32;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[32;43m0\u001b[39;49m\u001b[43m)\u001b[49m\n", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[48]\u001b[39m\u001b[32m, line 2\u001b[39m, in \u001b[36msimple_div\u001b[39m\u001b[34m(a, b)\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34msimple_div\u001b[39m(a,b):\n\u001b[32m----> \u001b[39m\u001b[32m2\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43ma\u001b[49m\u001b[43m \u001b[49m\u001b[43m/\u001b[49m\u001b[43m \u001b[49m\u001b[43mb\u001b[49m\n", + "\u001b[31mZeroDivisionError\u001b[39m: division by zero" + ] + } + ], + "source": [ + "assert simple_div(25,5) == 5\n", + "assert simple_div(1, 3) == 0.3333333333333333333\n", + "assert simple_div(1, 0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c6547535-df7f-4f4a-9c14-a890943a8415", + "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.12.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}