Created
January 3, 2020 23:45
-
-
Save anmolj7/59a36b9b410f9e98b80b405f349986f3 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 58, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import numpy as np\n", | |
"import random\n", | |
"from functools import partial #To pass functions with their arguments.\n", | |
"import time \n", | |
"from matplotlib import pyplot as plt" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def normal_matrix_mul(X, Y):\n", | |
" #Too lazy to write 3 lines, so, just writing the code using list compression. \n", | |
" #The time complexity of a naive matrix multiplication is 0(n^3)\n", | |
" result = [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)] for X_row in X]\n", | |
" return result " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def generate_matrix(n, List=list(range(10))):\n", | |
" \"\"\"\n", | |
" Generates A random matrix of the order NxN, with the given range.\n", | |
" \"\"\"\n", | |
" result = [[random.choice(List) for _ in range(n)] for __ in range(n)]\n", | |
" return result" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 35, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def time_func(func):\n", | |
" start_time = time.time()\n", | |
" func()\n", | |
" end_time = time.time()\n", | |
" return end_time-start_time" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 52, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"Test_Sizes = np.arange(10, 300, 5) #since, naive matrix multiplication is of order 0(n^3), 300 input size becomes,27000000 Which starts to hang the laptop\n", | |
"\n", | |
"Numpy_Time = {}\n", | |
"Matrix_Time = {}\n", | |
"\n", | |
"for i, test_case in enumerate(Test_Sizes):\n", | |
" print(f'On Test Case {i+1}th out of {len(Test_Sizes)}')\n", | |
" #Generating a random matrix of order test_case \n", | |
" X = generate_matrix(test_case)\n", | |
" Numpy_Time[test_case] = time_func(partial(np.dot, X, X))\n", | |
" Matrix_Time[test_case] = time_func(partial(normal_matrix_mul, X, X))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<h1>Hardware used:</h1>\n", | |
"<ul>\n", | |
" <li>4GB AMD Radeon 560 RX GPU</li>\n", | |
" <li>8GB DDR4 Ram</li>\n", | |
" <li>Amd Ryzen 5 3350H</li>\n", | |
"</ul>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<h1>Graph For Time vs Input Size For Numpy</h1>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 86, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Text(0, 0.5, 'Time in seconds')" | |
] | |
}, | |
"execution_count": 86, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.plot(list(Numpy_Time.keys()), list(Numpy_Time.values()), color=\"orange\", label=\"Multiplication by Numpy\")\n", | |
"plt.legend()\n", | |
"plt.xlabel(\"Input Size: n\")\n", | |
"plt.ylabel(\"Time in seconds\")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<h1>Graph For Time Vs Input Size For Normal Python Multiplication</h1>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 88, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Text(0, 0.5, 'Time in seconds')" | |
] | |
}, | |
"execution_count": 88, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEGCAYAAABo25JHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3deXwV1fnH8c8DsriAlEWriAYXxIUgNIqKVnBF615s0Spo/RU3FAT3rWhf/iqiotgq2qKCUtytqKitAoKKYhCIAj8tKmgElUUQqyCB5/fHmYQQslySTCb33u/79ZrXvXdmcuc5meQ+95w5c465OyIikr0aJB2AiIgkS4lARCTLKRGIiGQ5JQIRkSynRCAikuW2SjqALdW6dWvPyclJOgwRkbQyc+bMZe7eprxtaZcIcnJyyM/PTzoMEZG0YmaLKtqmpiERkSynRCAikuWUCEREslzaXSMoz7p16ygsLGTNmjVJhyJppGnTpuyyyy40atQo6VBEEpURiaCwsJBmzZqRk5ODmSUdjqQBd2f58uUUFhbSvn37pMMRSVRGNA2tWbOGVq1aKQlIysyMVq1aqRYpQoyJwMzamdlkM5tvZnPNbGA5+/Qws1VmNjtabqrB8WoWsGQd/c2IBHE2DRUBQ9z9fTNrBsw0s3+7+7wy+01z9xNjjENEJP3dcgsceSQcdlitv3VsNQJ3X+Lu70fPVwPzgbZxHS9pZsaQIUNKXt9xxx0MHTq0TmM499xzefrpp8tdv80227B69eqSdQMHDsTMWLZsWcrveffdd/PDDz+UbDvhhBNYuXJlpT/fo0ePkhsAU9m/PFOmTOHtt98ueT1q1CjGjh27xe8jkrbmzoU//hEmTYrl7evkGoGZ5QBdgHfL2XyImc0xs5fNbL8Kfr6/meWbWf7SpUtjjLT6mjRpwrPPPlvlB2tFioqKajmiTe255548//zzAGzYsIHJkyfTtu2W5eWyiWDixIm0aNEi5Z/f0v2LlU0EF154IX379t3i9xFJW3fcAVtvDRdfHMvbx54IzGw74BlgkLt/V2bz+8Bu7t4ZuBf4Z3nv4e4Punueu+e1aVPuUBmJ22qrrejfvz8jRozYbNuiRYs46qijyM3N5aijjuLzzz8HwrftwYMH07NnT66++mqGDh1Kv379OPbYY8nJyeHZZ5/lqquuolOnTvTq1Yt169YBcMstt3DggQey//77079/f1KZZe7MM8/kiSeeAMIHa/fu3dlqq9AyuHDhQvbff/+SfcurzYwcOZLFixfTs2dPevbsCYThPpYtW8bChQvp2LEj/fr1Izc3l969e2+SMIoV7w8wduxYcnNz6dy5M+eccw4AL7zwAt26daNLly4cffTRfP311yxcuJBRo0YxYsQIDjjgAKZNm8bQoUO54447AJg9ezYHH3wwubm5nHbaaXz77bdAqIlcffXVHHTQQXTo0IFp06ZV+TsSqZe+/BLGjYPzz4fWrWM5RKyJwMwaEZLAOHd/tux2d//O3b+Pnk8EGplZzUo6aBD06FG7y6BBKR36kksuYdy4caxatWqT9QMGDKBv374UFBTwu9/9jssuu6xk28cff8xrr73GnXfeCcAnn3zCSy+9xPPPP8/ZZ59Nz549+eCDD9h666156aWXSt7vvffe48MPP+THH3/kxRdfrDK2vfbai6VLl/Ltt98yfvx4+vTpk1KZil122WXsvPPOTJ48mcmTJ2+2/aOPPqJ///4UFBTQvHlz7rvvvgrfa+7cudx6661MmjSJOXPmcM899wBw2GGH8c477zBr1iz69OnD7bffTk5ODhdeeCGXX345s2fP5vDDD9/kvfr27cuwYcMoKCigU6dO3HzzzSXbioqKmDFjBnffffcm60XSyj33wPr1MHhwbIeIs9eQAaOB+e5+VwX7/DzaDzM7KIpneVwxxa158+b07duXkSNHbrJ++vTpnHXWWQCcc845vPnmmyXbzjjjDBo2bFjy+vjjj6dRo0Z06tSJ9evX06tXLwA6derEwoULAZg8eTLdunWjU6dOTJo0iblz56YU3+mnn87jjz/Ou+++u9kHak21a9eO7t27A3D22WdvUsayJk2aRO/evWkdfbtp2bIlEO4HOe644+jUqRPDhw+vslyrVq1i5cqVHHHEEQD069ePqVOnlmw//fTTAfjFL35R8rsTSSvffQcPPAC9e0OM97vE2WuoO3AO8IGZzY7WXQfsCuDuo4DewEVmVgT8CPTxVNo5KnP33TX68ZoaNGgQXbt25bzzzqtwn9LdFrfddttNtjVp0gSABg0a0KhRo5J9GzRoQFFREWvWrOHiiy8mPz+fdu3aMXTo0JT7wvfp04euXbvSr18/GjTY+B1gq622YsOGDSWvq9O3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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.plot(list(Matrix_Time.keys()), list(Matrix_Time.values()), color=\"red\", label=\"Normal Multiplication\")\n", | |
"plt.legend()\n", | |
"plt.xlabel(\"Input Size: n\")\n", | |
"plt.ylabel(\"Time in seconds\")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<h1>Graph For Time Vs Input Size For Normal Python Multiplication, and numpy</h1>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 83, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Text(0, 0.5, 'Time in seconds')" | |
] | |
}, | |
"execution_count": 83, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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K6+8QkFBARs2bOCrr77iuOOOA9wv7+HDh9O5c+eiwWlK257t27ezatWqommpqaksX74coOgcSHkVDt/50ksv0a1bt6LpgwcPZtCgQXY0YPz1t7+5CqMPPlgtNYUisURQxZo2bcqIESP2m37RRRexbds2OnTowFNPPcWxxx673zLp6enUqlWL9u3bhx37uEuXLvz+97/npJNO4t577+XII4+MGMc999zD9u3badeuHe3bt2fhwoW0b9+ejh070rZtW6666qqiEcUgconpTp06MXToULp06ULXrl25+uqr6dixY3n+JBx33HH07NmTPn36MGnSJOrUqQO45qSDDz446p3tqFGjyM3NLXp+3333MWLECHr06FFslLfy2L17N127duWxxx4r9je/7LLL2L59e7ET/sZUqZwcyMyEPn3ckLgBsjLUMSIzM5N69epx2223BR1Klfnuu+/o1asXn332WbER06pLamoqWVlZ+50gB3j11VeZPXs206ZNi/j6RPjeGZ+owtlnw0cfuSqjzZv7vkorQ21qnKlTpzJq1CjGjx8fSBIozU033cS8efOYO3du0KGYeDVlCrzzDjz5ZLUkgbLYEYExFWTfO1MhmzbBCSe47qKLFlVbT6HSjghq1k+xSoi1hGZim33fTIWoujpCv/4Kzz4bWHfRkmpGFJVUp04dtm7dav+cplqoKlu3bi066W1M1F59FV57zXUZDdNhJChxcY6gadOm5ObmsmXLlqBDMQmiTp06NG3aNOgwTCzZuhVuvBFOPBFuvTXoaIqJi0SQkpJCixYtgg7DGGMiu/lm2LYN3n4batWsXW9cNA0ZY0yNtno1TJsGt98O7dsHHc1+LBEYY4zfxo2Dgw6qcU1ChSwRGGOMn779Fv71LzfOQKNGQUcTliUCY4zx0xNPQH6+O0dQQ1kiMMYYv+zcCZMmwUUXQcuWQUcTkSUCY4zxy7PPwo4dUMNrhFkiMMYYP+zZAxMmwKmnQpcuQUdTKt8SgYg0E5GFIrJORNaIyH61mcV5XETWi0i2iHTyKx5jjKlWr7wC33xT448GwN8LyvYCt6rqChGpDywXkXdUNXRsxD5Aa+/WFXjKuzfGmNil6rqMHn88lDK2eE3h2xGBqm5S1RXe453AOuCoEoudD0xV52PgEBE5wq+YjDGmWixYAJ984q4bqCGF5UpTLRGKSCrQEVhS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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.plot(list(Matrix_Time.keys()), list(Matrix_Time.values()), color=\"red\", label=\"Normal Multiplication\")\n", | |
"plt.plot(list(Numpy_Time.keys()), list(Numpy_Time.values()), color=\"orange\", label=\"Multiplication by Numpy\")\n", | |
"plt.legend()\n", | |
"plt.xlabel(\"Input Size: n\")\n", | |
"plt.ylabel(\"Time in seconds\")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<h1>Result</h1>\n", | |
"The graph is evident that there is an enormous difference between numpy and normal multiplication! Numpy is way faster than normal python matrix multiplication. The only explaination that I can think of for this, is, that numpy is written in C (a low level language), and C is believed to be around 5 or 10 times faster than python. The code we write in python, gets converted into C, and then is executed. Whereas Numpy's code is already in low level language. The best analogy for this scene would be if you buy something from a retailer, it'll be more expensive, than if you buy it from the wholesaler, from which even the retailer buys :P" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<h1>Part-2</h1>\n", | |
"Using @numba.jit" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 90, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Requirement already satisfied: numba in c:\\programdata\\anaconda3\\lib\\site-packages (0.45.1)\n", | |
"Requirement already satisfied: llvmlite>=0.29.0dev0 in c:\\programdata\\anaconda3\\lib\\site-packages (from numba) (0.29.0)\n", | |
"Requirement already satisfied: numpy in c:\\programdata\\anaconda3\\lib\\site-packages (from numba) (1.16.5)\n" | |
] | |
} | |
], | |
"source": [ | |
"!pip install numba" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 142, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from numba import jit" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 149, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"@jit('void(float64[:,:])', nopython=True)\n", | |
"def matmul(matrix1):\n", | |
" r_matrix = np.zeros(shape=(len(matrix1), len(matrix1)))\n", | |
" for i in range(len(matrix1)):\n", | |
" for j in range(len(matrix1[0])):\n", | |
" for k in range(len(matrix1)):\n", | |
" r_matrix[i][j] += matrix1[i][k] * matrix1[k][j]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 150, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"On Test Case 1th out of 58\n", | |
"On Test Case 2th out of 58\n", | |
"On Test Case 3th out of 58\n", | |
"On Test Case 4th out of 58\n", | |
"On Test Case 5th out of 58\n", | |
"On Test Case 6th out of 58\n", | |
"On Test Case 7th out of 58\n", | |
"On Test Case 8th out of 58\n", | |
"On Test Case 9th out of 58\n", | |
"On Test Case 10th out of 58\n", | |
"On Test Case 11th out of 58\n", | |
"On Test Case 12th out of 58\n", | |
"On Test Case 13th out of 58\n", | |
"On Test Case 14th out of 58\n", | |
"On Test Case 15th out of 58\n", | |
"On Test Case 16th out of 58\n", | |
"On Test Case 17th out of 58\n", | |
"On Test Case 18th out of 58\n", | |
"On Test Case 19th out of 58\n", | |
"On Test Case 20th out of 58\n", | |
"On Test Case 21th out of 58\n", | |
"On Test Case 22th out of 58\n", | |
"On Test Case 23th out of 58\n", | |
"On Test Case 24th out of 58\n", | |
"On Test Case 25th out of 58\n", | |
"On Test Case 26th out of 58\n", | |
"On Test Case 27th out of 58\n", | |
"On Test Case 28th out of 58\n", | |
"On Test Case 29th out of 58\n", | |
"On Test Case 30th out of 58\n", | |
"On Test Case 31th out of 58\n", | |
"On Test Case 32th out of 58\n", | |
"On Test Case 33th out of 58\n", | |
"On Test Case 34th out of 58\n", | |
"On Test Case 35th out of 58\n", | |
"On Test Case 36th out of 58\n", | |
"On Test Case 37th out of 58\n", | |
"On Test Case 38th out of 58\n", | |
"On Test Case 39th out of 58\n", | |
"On Test Case 40th out of 58\n", | |
"On Test Case 41th out of 58\n", | |
"On Test Case 42th out of 58\n", | |
"On Test Case 43th out of 58\n", | |
"On Test Case 44th out of 58\n", | |
"On Test Case 45th out of 58\n", | |
"On Test Case 46th out of 58\n", | |
"On Test Case 47th out of 58\n", | |
"On Test Case 48th out of 58\n", | |
"On Test Case 49th out of 58\n", | |
"On Test Case 50th out of 58\n", | |
"On Test Case 51th out of 58\n", | |
"On Test Case 52th out of 58\n", | |
"On Test Case 53th out of 58\n", | |
"On Test Case 54th out of 58\n", | |
"On Test Case 55th out of 58\n", | |
"On Test Case 56th out of 58\n", | |
"On Test Case 57th out of 58\n", | |
"On Test Case 58th out of 58\n" | |
] | |
} | |
], | |
"source": [ | |
"Test_Sizes = np.arange(10, 300, 5) #since, naive matrix multiplication is of order 0(n^3), 300 input size becomes,27000000 Which starts to hang the laptop\n", | |
"\n", | |
"Numpy_Time = {}\n", | |
"Matrix_Time = {}\n", | |
"\n", | |
"for i, test_case in enumerate(Test_Sizes):\n", | |
" print(f'On Test Case {i+1}th out of {len(Test_Sizes)}')\n", | |
" #Generating a random matrix of order test_case \n", | |
" X = np.random.rand(test_case, test_case)\n", | |
" Numpy_Time[test_case] = time_func(partial(np.dot, X, X))\n", | |
" Matrix_Time[test_case] = time_func(partial(matmul, X))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<h1>Graph For Time Vs Input Size For Numba Jit Python Multiplication, and numpy</h1>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 151, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Text(0, 0.5, 'Time in seconds')" | |
] | |
}, | |
"execution_count": 151, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.plot(list(Matrix_Time.keys()), list(Matrix_Time.values()), color=\"red\", label=\"Normal Multiplication\")\n", | |
"plt.plot(list(Numpy_Time.keys()), list(Numpy_Time.values()), color=\"orange\", label=\"Multiplication by Numpy\")\n", | |
"plt.legend()\n", | |
"plt.xlabel(\"Input Size: n\")\n", | |
"plt.ylabel(\"Time in seconds\")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<h1>Result</h1>\n", | |
"The graph is evident that there is an enormous difference between numpy and numba jit matrix multiplication. Adding @jit did increase the time, but numpy is still faster" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"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.7.4" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment