Created
December 5, 2018 08:43
-
-
Save khinsen/4b11244c8ecfdc8288779c1764f6a8ff to your computer and use it in GitHub Desktop.
NumPy - mesures du temps CPU
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", | |
"metadata": {}, | |
"source": [ | |
"# NumPy 2 : exercices d'échauffement" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"%matplotlib inline\n", | |
"import numpy as np\n", | |
"import matplotlib.pyplot as plt" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Combien gagne-t-on en temps CPU avec NumPy ?" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Python propose un module pour mesurer la durée d'exécution d'une commande, qui prend certaines précautions pour assurer des résultats fiables. Notamment, la commande est exécutée plusieurs fois afin d'obtenir un temps moyen qui est beaucoup moins sensible aux aléas de l'environnement qu'une mesure unique.\n", | |
"\n", | |
"Voici comment l'utiliser :" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"0.0038431570001193904\n" | |
] | |
} | |
], | |
"source": [ | |
"import timeit\n", | |
"\n", | |
"print(timeit.timeit(\"len(range(10))\", number=10000))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Le principe est simple: on fournit la commande sous forme d'une chaîne de caractères, et le nombre de répétition, et on obtient le temps d'exécution moyen en secondes.\n", | |
"\n", | |
"A la place d'une chaîne de caractères, on peut donner une fonction *sans arguments* :" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"0.005144783000105235\n" | |
] | |
} | |
], | |
"source": [ | |
"def test():\n", | |
" return len(range(10))\n", | |
"\n", | |
"print(timeit.timeit(test, number=10000))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Le temps est plus long dans ce cas, parce que l'appel à la fonction a aussi un coût, qui est en fait de la même ordre de grandeur que le coût de la simple fonction `len`. Mais ce petit surcoût devient négligeable quand on mesure des calculs plus substantiels, ce que nous allons faire par la suite." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Exercice : temps d'exécution pour additioner deux listes ou deux tableaux\n", | |
"\n", | |
"Nous reprenons la génération de listes de nombres aléatoires de la semaine dernière :" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"import random\n", | |
"\n", | |
"def liste_de_nombres_aleatoires(n):\n", | |
" return [random.uniform(0, 1) for _ in range(n)]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"A vous de faire :\n", | |
"\n", | |
" 1. Ecrivez une fonction qui additionne deux listes élément par élément.\n", | |
" 2. Vérifiez que votre fonction donne le même résultat pour deux listes aléatoires que l'addition des deux listes converties en tableaux.\n", | |
" 3. Mesurez le temps d'exécution de votre fonction pour des listes aléatoires de tailles entre 10 et 1000.\n", | |
" 4. Mesures également le temps d'exécution de la somme après conversion en tableaux.\n", | |
" 5. Faites un plot des deux temps d'exécutions en fonction du nombre d'éléments.\n", | |
" 6. Faites un plot des deux temps d'exécutions *par élément* en fonction du nombre d'éléments." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Pour vous aider avec les deux premières étapes, voici le code qui fait la vérification. Il vous reste à compléter la définition de la fonction `somme_de_listes`. Si tout va bien, le test produit `True` pour chaque itération de la boucle.\n", | |
"\n", | |
"Cet exemple illustre qu'un tableau peut aussi contenir de booléens, donc des valeurs `True` ou `False`. La comparaison `t1 == t2` compare `t1` et `t2` élément par élément et retourne un tel tableau de booléens. Avec `.all()` on teste si tous les éléments ont la valeur `True`." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"hide_input": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"True\n", | |
"True\n", | |
"True\n", | |
"True\n", | |
"True\n" | |
] | |
} | |
], | |
"source": [ | |
"def somme_de_listes(l1, l2):\n", | |
" return [x + y for x, y in zip(l1, l2)]\n", | |
"\n", | |
"for i in range(5):\n", | |
" l1 = liste_de_nombres_aleatoires(10)\n", | |
" l2 = liste_de_nombres_aleatoires(10)\n", | |
" somme_listes = somme_de_listes(l1, l2)\n", | |
" t1 = np.array(l1)\n", | |
" t2 = np.array(l2)\n", | |
" somme_tableaux = t1 + t2\n", | |
" print((np.array(somme_listes) == somme_tableaux).all())" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Pour ceux qui n'ont pas vu la fonction `zip` avant, voici comment elle fonctionne :" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[(1, 'a'), (2, 'b'), (3, 'c')]" | |
] | |
}, | |
"execution_count": 7, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"list(zip([1, 2, 3], ['a', 'b', 'c'])) " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Pour les mesures des étapes 4 à 6, il reste un astuce à connaître. Il faut contourner la contrainte de `timeit.timeit`, qui n'accepte qu'une fonction sans argument. Impossible donc de faire quelque chose comme\n", | |
"`timeit.timeit(somme_de_listes(l1, l2))`. L'astuce est de définir une fonction supplémentaire rien que pour mesurer le temps d'exécution. Voici un exemple :" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"0.00013218300045991782\n" | |
] | |
} | |
], | |
"source": [ | |
"l1 = liste_de_nombres_aleatoires(10)\n", | |
"l2 = liste_de_nombres_aleatoires(10)\n", | |
"def temps():\n", | |
" return somme_de_listes(l1, l2)\n", | |
"print(timeit.timeit(temps, number=100))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Vous pouvez faire cela même dans une boucle :" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"50 0.003870102998916991\n", | |
"100 0.0073099260007438716\n", | |
"500 0.0457768300002499\n" | |
] | |
} | |
], | |
"source": [ | |
"for n in [50, 100, 500]:\n", | |
" l1 = liste_de_nombres_aleatoires(n)\n", | |
" l2 = liste_de_nombres_aleatoires(n)\n", | |
" def temps():\n", | |
" return somme_de_listes(l1, l2)\n", | |
" print(n, timeit.timeit(temps, number=1000))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"A vous de jouer ! N'hésitez pas à consulter le notebook de la semaine dernière comme source d'inspiration." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"hide_input": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<matplotlib.legend.Legend at 0x10f70da20>" | |
] | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x10f327470>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"n = np.linspace(0, 1000, 100, dtype=np.int)\n", | |
"t_liste = []\n", | |
"t_tableau = []\n", | |
"for nn in n:\n", | |
" l1 = liste_de_nombres_aleatoires(nn)\n", | |
" l2 = liste_de_nombres_aleatoires(nn)\n", | |
" t1 = np.array(l1)\n", | |
" t2 = np.array(l2)\n", | |
" def somme_listes():\n", | |
" return [x + y for x, y in zip(l1, l2)]\n", | |
" def somme_tableaux():\n", | |
" return t1 + t2\n", | |
" t_liste.append(timeit.timeit(somme_listes, number=100))\n", | |
" t_tableau.append(timeit.timeit(somme_tableaux, number=100))\n", | |
"plt.plot(n, t_liste, label='liste')\n", | |
"plt.plot(n, t_tableau, label='tableau')\n", | |
"plt.legend()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": { | |
"hide_input": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<matplotlib.legend.Legend at 0x10f8f6940>" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n7zOR5BAaHq4AAAAASUVORK5CYII=\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x10b74d240>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"n = np.linspace(10, 1000, 100, dtype=np.int)\n", | |
"t_liste = []\n", | |
"t_tableau = []\n", | |
"for nn in n:\n", | |
" l1 = liste_de_nombres_aleatoires(nn)\n", | |
" l2 = liste_de_nombres_aleatoires(nn)\n", | |
" t1 = np.array(l1)\n", | |
" t2 = np.array(l2)\n", | |
" def somme_listes():\n", | |
" return [x + y for x, y in zip(l1, l2)]\n", | |
" def somme_tableaux():\n", | |
" return t1 + t2\n", | |
" t_liste.append(timeit.timeit(somme_listes, number=100)/nn)\n", | |
" t_tableau.append(timeit.timeit(somme_tableaux, number=100)/nn)\n", | |
"plt.plot(n, t_liste, label='liste')\n", | |
"plt.plot(n, t_tableau, label='tableau')\n", | |
"plt.legend()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Enfin, on peut s'intéresser à la performance *relative* de listes et de tableaux. On divise donc, pour une taille donnée, la temps obtenu pour les listes par le temps obtenu pour les tableaux :" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[<matplotlib.lines.Line2D at 0x119c529b0>]" | |
] | |
}, | |
"execution_count": 11, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x119439e48>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"n = np.linspace(10, 10000, 100, dtype=np.int)\n", | |
"t_rel = []\n", | |
"for nn in n:\n", | |
" l1 = liste_de_nombres_aleatoires(nn)\n", | |
" l2 = liste_de_nombres_aleatoires(nn)\n", | |
" t1 = np.array(l1)\n", | |
" t2 = np.array(l2)\n", | |
" def somme_listes():\n", | |
" return [x + y for x, y in zip(l1, l2)]\n", | |
" def somme_tableaux():\n", | |
" return t1 + t2\n", | |
" t_liste = timeit.timeit(somme_listes, number=100)\n", | |
" t_tableau = timeit.timeit(somme_tableaux, number=100)\n", | |
" t_rel.append(t_liste / t_tableau)\n", | |
"plt.plot(n, t_rel)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Sur mon ordinateur, je gagne donc environ un facteur 100 en utilisant les tableaux. Ceci ne vaut que pour mon ordinateur, et que pour l'addition, bien sûr !" | |
] | |
} | |
], | |
"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.6.1" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment