Last active
August 27, 2023 08:13
-
-
Save juhasch/c89d2d582aed8f21df523f10e7e62f3d to your computer and use it in GitHub Desktop.
Mypy compilation example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"id": "46f37abc-d49e-42b8-8f3a-9c4fba5b2bf7", | |
"metadata": {}, | |
"source": [ | |
"# Compare Python vs. mypyc-compiled vs. Numba" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "3ea99f29-5ba7-4ef3-a0c2-4e57f649ef8c", | |
"metadata": {}, | |
"source": [ | |
"## Pure Python" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"id": "cbb7f56d-4acc-49ba-9974-81d3b3f82d18", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"34\n" | |
] | |
} | |
], | |
"source": [ | |
"def fibonacci_recursive(n):\n", | |
" if n <= 0:\n", | |
" return \"Invalid Input\"\n", | |
" elif n == 1:\n", | |
" return 0\n", | |
" elif n == 2:\n", | |
" return 1\n", | |
" else:\n", | |
" return fibonacci_recursive(n-1) + fibonacci_recursive(n-2)\n", | |
"\n", | |
"# Test the function\n", | |
"print(fibonacci_recursive(10)) # Output: 34\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"id": "7cf3671c-f8ff-41a3-9686-3b60f028d4e4", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"507 µs ± 2.89 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n" | |
] | |
} | |
], | |
"source": [ | |
"%%timeit\n", | |
"fibonacci_recursive(20)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"id": "9f44976d-c6f4-416a-8b99-32b5e0278c92", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"34\n" | |
] | |
} | |
], | |
"source": [ | |
"def fibonacci_iterative(n):\n", | |
" if n <= 0:\n", | |
" return \"Invalid Input\"\n", | |
" elif n == 1:\n", | |
" return 0\n", | |
" elif n == 2:\n", | |
" return 1\n", | |
" else:\n", | |
" a, b = 0, 1\n", | |
" for _ in range(n - 2):\n", | |
" a, b = b, a + b\n", | |
" return b\n", | |
"\n", | |
"# Test the function\n", | |
"print(fibonacci_iterative(10)) # Output: 34\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"id": "2d095726-4d1e-47e6-a364-ec5443558587", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"323 ns ± 1.43 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)\n" | |
] | |
} | |
], | |
"source": [ | |
"%%timeit\n", | |
"fibonacci_iterative(20)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "d484c650-8fa9-416c-a418-f6b28ce26f68", | |
"metadata": {}, | |
"source": [ | |
"## Mypyc compiled!" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "2710a6f9-a42e-4e1d-a482-f86169108ea4", | |
"metadata": {}, | |
"source": [ | |
"Simply compile the files using `mypyc fib_iter.py` and `mypyc fib_rec.py`." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"id": "7efa4667-98dc-464f-8d44-0116819f7af4", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from fib_rec import fibonacci_recursive" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"id": "f706b6b8-0609-497b-85ea-68cc61a1bd32", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"39.7 µs ± 156 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n" | |
] | |
} | |
], | |
"source": [ | |
"%%timeit\n", | |
"fibonacci_recursive(20)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"id": "ea89b23b-55f3-4d84-980d-d413a4a66467", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from fib_iter import fibonacci_iterative" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"id": "8ed35463-9199-4c61-b556-65117a06ba7c", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"97.5 ns ± 2.52 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)\n" | |
] | |
} | |
], | |
"source": [ | |
"%%timeit\n", | |
"fibonacci_iterative(20)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "ef41421f-3402-4642-9bae-884f00db35ba", | |
"metadata": {}, | |
"source": [ | |
"## Numba" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"id": "88b2fa3f-d385-4a4e-bda6-f8811cd26008", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from numba import njit" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"id": "696b22dd-9eed-4a4d-8b15-7945425b9d36", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"@njit\n", | |
"def fibonacci_recursive(n: int) -> int:\n", | |
" if n <= 0:\n", | |
" return -1\n", | |
" elif n == 1:\n", | |
" return 0\n", | |
" elif n == 2:\n", | |
" return 1\n", | |
" else:\n", | |
" return fibonacci_recursive(n-1) + fibonacci_recursive(n-2)\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"id": "c5e0a068-c4c1-45f1-8210-8ba88e47b29e", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"17.9 µs ± 77.4 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)\n" | |
] | |
} | |
], | |
"source": [ | |
"%%timeit\n", | |
"fibonacci_recursive(20)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"id": "59988c17-4cb4-4729-8d44-4d5ee302a7bf", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"@njit\n", | |
"def fibonacci_iterative(n: int) -> int:\n", | |
" if n <= 0:\n", | |
" return -1\n", | |
" elif n == 1:\n", | |
" return 0\n", | |
" elif n == 2:\n", | |
" return 1\n", | |
" else:\n", | |
" a, b = 0, 1\n", | |
" for _ in range(n - 2):\n", | |
" a, b = b, a + b\n", | |
" return b\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"id": "43455e39-8d4b-4b28-8a36-a66d89f49432", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"60.1 ns ± 0.515 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)\n" | |
] | |
} | |
], | |
"source": [ | |
"%%timeit\n", | |
"fibonacci_iterative(20)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 39, | |
"id": "4f50b756-389c-4a9f-a175-1dbe64be01d1", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# Plot it" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"id": "396dd1b5-2f52-4cb5-8f70-cc67e0defa92", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"mode = ['Pure Python', 'Mypyc compiled', 'Numba compiled']\n", | |
"t_iter = [ 323, 97.5,60.1 ] # ns\n", | |
"dt_iter = [ 1.43, 2.52 ,0.515 ] # ± ns\n", | |
"t_rec = [ 507, 39.7 , 17.9 ] # µs\n", | |
"dt_rec = [2.89, 0.156, 0.0774 ] # µs ± " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 38, | |
"id": "578871b8-1085-4371-b51c-fe79bbd27dad", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Text(0.5, 1.0, 'Iterative Fibonnaci Calculation')" | |
] | |
}, | |
"execution_count": 38, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAoMAAAHFCAYAAACJh/NiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA9H0lEQVR4nO3dZ3gV1f728XuH9EoLKX8CoUiIdIhogkIAJVRFUYqohADShSNYUIEElCLFghRFCeBBkaMCCko50psUqVIFAkgRAQk9kGSeFz7Zx00qEIywvp/rmsvsNWvW/GZlYm5m9uzYLMuyBAAAACM5FXQBAAAAKDiEQQAAAIMRBgEAAAxGGAQAADAYYRAAAMBghEEAAACDEQYBAAAMRhgEAAAwGGEQAADAYIRBAHZTp06VzWbTxo0b7W3fffed4uPjC66oPNQRGhqq2NjYv7UeSYqOjpbNZsty2bFjh+Lj42Wz2TLV2rx587+91oIUGxur0NDQPPf/9ttv1aJFCwUEBMjV1VVFixZVw4YNNWPGDF27du2G9x8dHa3o6Ogb3i6vMn5ukpKSbnjbNWvWKD4+XmfPns207nbXDWRwLugCAPyzfffddxo/fnyBB8Kc6pg9e7Z8fX3//qIklS1bVjNmzMjUXq5cOXXu3FmNGzcugKr+WQYOHKg+ffrk2s+yLMXFxWnq1Klq2rSpxo4dq5CQECUnJ2vp0qXq0aOHTp06laex7hRr1qxRQkKCYmNjVbhwYYd1EyZMKJiiYBzCIIACcenSJXl6eubLWDVq1MiXcW6Gh4eHHnjggSzXlSxZUiVLlvybK/rnKVeuXJ76jRo1SlOnTlVCQoIGDRrksK5FixZ6+eWX9csvv9yOEv+R7r333oIuAYbgNjGAbMXGxmr8+PGS5HALNON2mGVZmjBhgqpXry4PDw8VKVJETz75pA4cOOAwTnR0tCpXrqwVK1YoKipKnp6eiouLkyR98cUXatSokYKCguTh4aHw8HC9+uqrunjxYp7r+Ott4t9//12urq4aOHBgpuPZvXu3bDab3n//fXvbiRMn1LVrV5UsWVKurq4qU6aMEhISlJqaesvzl9Vt4gyzZ89W1apV5e7urrJlyzrUlOHw4cN65plnVKJECbm5uSk8PFxjxoxRenq6vU9SUpJsNptGjx6tsWPHqkyZMvL29lZkZKTWrVvnMF5sbKy8vb31yy+/qGnTpvL29lZISIj69eunlJQUh74JCQm6//77VbRoUfn6+qpmzZr65JNPZFlWpjo/++wzRUZGytvbW97e3qpevbo++eQTh/3mdpv42rVrGjlypCpWrJjl906SAgMD9eCDD95UjddLSUnRkCFDFB4eLnd3dxUrVkz169fXmjVrJP1vXqdOnZppW5vNluuV8sWLF+uxxx5TyZIl5e7urvLly6tr1646deqUvU98fLxeeuklSVKZMmXs5/WyZcskZX2b+MyZM+rRo4f+7//+T66uripbtqxef/31TN8/m82mXr166dNPP1V4eLg8PT1VrVo1zZs3L9e5gXm4MgggWwMHDtTFixf15Zdfau3atfb2oKAgSVLXrl01depUvfDCCxo5cqTOnDmjIUOGKCoqSlu3blVAQIB9m+PHj+uZZ57Ryy+/rGHDhsnJ6c9/i+7bt09NmzZV37595eXlpd27d2vkyJFav369lixZkqc6/srf31/NmzfXtGnTlJCQYN+PJCUmJsrV1VXt27eX9GcQrF27tpycnDRo0CCVK1dOa9eu1ZtvvqmkpCQlJibmaZ6uD45OTk4O+73eli1b1LdvX8XHxyswMFAzZsxQnz59dPXqVfXv31/Sn6E2KipKV69e1dChQxUaGqp58+apf//+2r9/f6ZbiOPHj1fFihX17rvv2uesadOmOnjwoPz8/Oz9rl27pkcffVSdOnVSv379tGLFCg0dOlR+fn4OV+OSkpLUtWtXlSpVSpK0bt069e7dW0ePHnXoN2jQIA0dOlRPPPGE+vXrJz8/P+3YsUOHDh3K09xl2Lhxo86cOaMuXbpkG6Cvl9car5eamqomTZpo5cqV6tu3rxo0aKDU1FStW7dOhw8fVlRU1A3VnpX9+/crMjJSnTt3lp+fn5KSkjR27Fg9+OCD2r59u1xcXNS5c2edOXNG48aN09dff20/n7O7InjlyhXVr19f+/fvV0JCgqpWraqVK1dq+PDh2rJli+bPn+/Qf/78+dqwYYOGDBkib29vvf3223r88ce1Z88elS1b9paPEXcRCwD+v8TEREuStWHDBntbz549raz+V7F27VpLkjVmzBiH9iNHjlgeHh7Wyy+/bG+rV6+eJcn64Ycfctx/enq6de3aNWv58uWWJGvr1q251mFZllW6dGmrQ4cO9tfffPONJclatGiRvS01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", | |
"text/plain": [ | |
"<Figure size 640x480 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"import matplotlib.pyplot as plt\n", | |
"fig, ax = plt.subplots()\n", | |
"ax.barh(mode,t_iter, xerr=dt_iter)\n", | |
"ax.set_xlabel('Runtime in ns');\n", | |
"ax.set_title('Iterative Fibonnaci Calculation')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 37, | |
"id": "dae0747a-3ad4-4466-9e97-1212630482a8", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Text(0.5, 1.0, 'Iterative Fibonnaci Calculation')" | |
] | |
}, | |
"execution_count": 37, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAoMAAAHFCAYAAACJh/NiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA8pklEQVR4nO3dZ3gV1f728XuH9EoLCfkTDDVESigRTVAIoESackQRRCUElC4cwYIKJKAUEVQQsBLAgyLnKKCgCEd6kxp6EwggRQQk9ECSeV74ZB83qUAghvX9XNdcZtasWfObtbfmdmbPjs2yLEsAAAAwklNhFwAAAIDCQxgEAAAwGGEQAADAYIRBAAAAgxEGAQAADEYYBAAAMBhhEAAAwGCEQQAAAIMRBgEAAAxGGARgN2XKFNlsNq1fv97e9v333ys+Pr7wispHHSEhIYqNjb2t9UhSdHS0bDZbtsu2bdsUHx8vm82WpdZWrVrd9loLU2xsrEJCQvLd/7vvvlPr1q0VEBAgV1dXlSxZUk2bNtX06dN19erV6z5+dHS0oqOjr3u//Mr89yY5Ofm69121apXi4+N15syZLNtudd1AJufCLgDA39v333+vCRMmFHogzK2OWbNmydfX9/YXJalixYqaPn16lvZKlSqpa9euevjhhwuhqr+XQYMGqW/fvnn2syxLcXFxmjJlilq0aKGxY8cqODhYKSkpWrx4sXr27KmTJ0/ma6yiYtWqVUpISFBsbKyKFy/usG3ixImFUxSMQxgEUCguXrwoT0/PAhmrTp06BTLOjfDw8NB9992X7bZy5cqpXLlyt7miv59KlSrlq9/o0aM1ZcoUJSQkaPDgwQ7bWrdurZdfflm//PLLrSjxb+nuu+8u7BJgCG4TA8hRbGysJkyYIEkOt0Azb4dZlqWJEyeqdu3a8vDwUIkSJfT4449r//79DuNER0erRo0aWrZsmaKiouTp6am4uDhJ0ldffaVmzZqpbNmy8vDwUFhYmF599VVduHAh33X89Tbx77//LldXVw0aNCjL+ezatUs2m03jxo2ztx0/flzdunVTuXLl5OrqqgoVKighIUFpaWk3PX/Z3SbONGvWLNWqVUvu7u6qWLGiQ02ZDh06pKefflplypSRm5ubwsLCNGbMGGVkZNj7JCcny2az6Z133tHYsWNVoUIFeXt7KzIyUmvWrHEYLzY2Vt7e3vrll1/UokULeXt7Kzg4WP3791dqaqpD34SEBN17770qWbKkfH19VbduXX322WeyLCtLnV988YUiIyPl7e0tb29v1a5dW5999pnDcfO6TXz16lWNGjVK1apVy/a1k6TAwEDdf//9N1TjtVJTUzV06FCFhYXJ3d1dpUqVUuPGjbVq1SpJ/5vXKVOmZNnXZrPleaV84cKFevTRR1WuXDm5u7urcuXK6tatm06ePGnvEx8fr5deekmSVKFCBfv7esmSJZKyv018+vRp9ezZU//3f/8nV1dXVaxYUa+//nqW189ms6l37976/PPPFRYWJk9PT4WHh2vu3Ll5zg3Mw5VBADkaNGiQLly4oP/85z9avXq1vb1s2bKSpG7dumnKlCl64YUXNGrUKJ0+fVpDhw5VVFSUNm/erICAAPs+x44d09NPP62XX35Zw4cPl5PTn/8vunfvXrVo0UL9+vWTl5eXdu3apVGjRmnt2rVatGhRvur4K39/f7Vq1UpTp05VQkKC/TiSlJiYKFdXV3Xs2FHSn0Gwfv36cnJy0uDBg1WpUiWtXr1ab775ppKTk5WYmJivebo2ODo5OTkc91pJSUnq16+f4uPjFRgYqOnTp6tv3766cuWKBgwYIOnPUBsVFaUrV65o2LBhCgkJ0dy5czVgwADt27cvyy3ECRMmqFq1anrvvffsc9aiRQsdOHBAfn5+9n5Xr17VI488oi5duqh///5atmyZhg0bJj8/P4erccnJyerWrZvKly8vSVqzZo369OmjI0eOOPQbPHiwhg0bpscee0z9+/eXn5+ftm3bpoMHD+Zr7jKtX79ep0+f1nPPPZdjgL5Wfmu8Vlpampo3b67ly5erX79+atKkidLS0rRmzRodOnRIUVFR11V7dvbt26fIyEh17dpVfn5+Sk5O1tixY3X//fdr69atcnFxUdeuXXX69GmNHz9e33zzjf39nNMVwcuXL6tx48bat2+fEhISVKtWLS1fvlwjRoxQUlKS5s2b59B/3rx5WrdunYYOHSpvb2+9/fbb+sc//qHdu3erYsWKN32OuINYAPD/JSYmWpKsdevW2dt69eplZfefitWrV1uSrDFjxji0Hz582PLw8LBefvlle1ujRo0sSdZPP/2U6/EzMjKsq1evWkuXLrUkWZs3b86zDsuyrLvuusvq1KmTff3bb7+1JFkLFiyw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rFghb29vPfzww7py5YokacyYMZo8ebI+++wzrVixQqdPn9asWbNyHTc1NVVnz551WP5uDr/7eGGXAADAHaHAwuAzzzyjFStWKDk5WQcPHtTKlSv19NNPO/Tx8PDQU0895RAap0+frnLlyik6OtredvnyZU2dOlW1a9dWw4YNNX78eM2YMcN+NbBLly4OY8ybN08XL15Uu3btJElvv/22IiIiNHHiRIWHh6t69erq3bu3SpcunW3tufW/cOGCJk2apNGjR6t58+a6++679cknn8jDw0OfffaZwzhvvvmmGjRooDp16qhLly5aunSpJk2apDp16uiBBx7Q448/rsWLFzvsExwcrHfffVehoaHq2LGj+vTpo3fffTdfcz5jxgw5OTnp008/Vc2aNRUWFqbExEQdOnRIS5YskSS99957GjhwoNq2bauwsDB9+OGH8vPzy3XcESNGyM/Pz74EBwfnqx4AAFD0FFgYLF26tFq2bKmpU6cqMTFRLVu2zDZ8Pffcc1qwYIGOHDkiSUpMTLQ/hJKpfPnyKleunH09MjJSGRkZ2r17t6Q/H1r55ZdftGbNGkl/XoVs166dvLy8JP3vSl9+5dZ/3759unr1qho0aGBvc3FxUf369bVz506HvrVq1bL/HBAQIE9PT1WsWNGh7cSJEw773HfffQ7nHhkZqb179+Z4FfOvNmzYoF9++UU+Pj7y9vaWt7e3SpYsqcuXL2vfvn1KSUnRsWPHFBkZad/H2dlZERERuY47cOBApaSk2JfDhw/nWcvtFvzP/xR2CQAA3BGcC3KwuLg49e7dW5I0YcKEbPvUqVNH4eHhmjZtmmJiYrR161Z99913uY6bGZYy/1mmTBm1bt1aiYmJqlixor7//nv7lTDpzyuQ1yO3/pmfr/trYMtsv7bNxcXFoea/rme2ZWRkXFdtucnIyFC9evU0ffr0LNv8/f1veFw3Nze5ubndTGm3nJOre2GXAADAHaFAv2cw87NqV65cUUxMTI79unbtqsTERE2ePFkPPvhgltuQhw4d0tGjR+3rq1evlpOTk6pWreowxowZM/TRRx+pUqVKDlfuatWqpZ9++infdefWv3LlynJ1ddWKFSvsbVevXtX69esVFhaW72PkJPPq5l/Xq1SpomLFiuW5b926dbV3716VKVNGlStXdlgyb/GWLVvW4RhpaWnasGHDTdcN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", | |
"text/plain": [ | |
"<Figure size 640x480 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"import matplotlib.pyplot as plt\n", | |
"fig, ax = plt.subplots()\n", | |
"ax.barh(mode,t_rec, xerr=dt_rec)\n", | |
"ax.set_xlabel('Runtime in us');\n", | |
"ax.set_title('Iterative Fibonnaci Calculation')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "216c5e83-4a7f-4e5f-9751-932406589218", | |
"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.11.4" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment