Session du 03 décembre 2024 à 21h00
Bases du Langage
TOSA & Certifications
Librairie Standard & Modules
Deviens membre Premium magic_button
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- check +100h de formations
- check +180 exercices de code
- check +100h de mentorats en rediffusion
- check 20 projets
- check Mentorats groupés hebdomadaires
- check Support individuel avec nos mentors
Maîtriser générateurs et mémoire en Python
Découvrez comment les générateurs et les itérateurs permettent de réduire l’empreinte mémoire, puis préparez-vous à approfondir l’utilisation de lru_cache.
00:00:30 :là il y a pas mal de choses à voir avec et c'est assez sympa aussi pour gérer sa mémoire en Python.Alors je vais commencer par partager ça, hop là, alors qu'est-ce que je vais être là,alors au niveau de la taille, est-ce que c'est bon pour tout le monde ?
00:01:06 :Vous voulez que je grossisse un peu plus ?Ouais si tu peux zoomer un peu, là c'est bon.Là c'est bon, ok, c'est mieux, merci beaucoup, ok, on va partir là-dessus.
00:01:18 :Alors on va revoir un petit peu comment on crée les générateurs et on va voir exactement quel est l'intérêt.Alors un générateur à la base c'est tout simplement une fonction, donc par exemple si je vous propose ça,alors je vais l'appeler directement MyGN pour faciliter la suite, par exemple si on veut étirer sur une liste,
00:01:44 :et retourner à chaque fois, non j'ai pas fait un return comme ça, on va afficher, on va print directement,voilà donc ça, il n'y a pas de grande découverte pour qui que ce soit, je lance, qu'est-ce qu'il m'a fait ?
00:02:07 :Hop, je lance la fonction, je sais ce que j'ai fait de bêtise, voilà, donc je lance le script,pas de grande surprise, là il va nous afficher la liste d'un coup.
00:02:30 :Le petit défaut qu'il y a là-dedans, bon là on est sur une liste de 10 items, c'est pas énorme,mais vous pouvez imaginer avec tout un nombre d'items, là ce qui se passe techniquement pour Python,c'est qu'il a créé du coup derrière, sans que vous vous en rendiez compte, une liste qui contient tous les chiffres,
00:02:47 :donc 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, et il les a mis en mémoire.Donc on a occupé la mémoire avec 10 items, sauf que généralement quand on boucle sur une liste comme ça,par exemple sur un corps qui est rendu, quand on utilise ça, c'est parce qu'on veut utiliser un compteur
00:03:03 :ou autre pour surveiller certaines actions, voire utiliser le compte pour afficher des choses,mais en soi on n'a pas forcément la nécessité à ce que ces chiffres restent strictement en mémoire.
00:03:17 :Donc c'est là qu'on va pouvoir gagner un petit peu de mémoire avec les générateurs,on va pouvoir faire ça et on va tout simplement modifier notre fonction.
00:03:27 :Alors la grosse différence d'un générateur, c'est que, par exemple on pourrait imaginer,donc je ne l'ai pas fait parce que ça aurait forcément bouclé la fonction,mais si je voulais renvoyer chiffres, je ferais tout simplement return if,admettant bien sûr que ce n'est pas le cas, mais en admettant qu'à chaque fois ça ne coupe pas ma fonction.
00:03:49 :Pour faire la même chose avec un générateur, pour que ma fonction devienne un générateur,on va utiliser le mot clé yield.Donc là, à chaque fois que ça va boucler dans ma boucle du range, ça va me renvoyer la valeur actuelle.
00:04:07 :Pour l'utiliser, tout bêtement, je vais mettre ma fonction dans une variable,et là la petite astuce, puisqu'on a affaire à un générateur,pour pouvoir l'afficher, on pourrait la récupérer dans d'autres choses,on va utiliser la commande next, en indiquant sur quel itérateur on va vouloir boucler.
00:04:35 :Et donc là, si je fais ça, dans un premier temps, il me renvoie jusqu'au 0.S'il veut avoir tous mes chiffres, je vais faire la même chose.
00:04:49 :Et je vais afficher mon next.Voilà. Donc là, on est revenu au même état,donc la lumière finalement, on a réécrit deux fois plus de codes pour faire exactement la même chose.
00:05:14 :Sauf que là, l'intérêt qu'on va avoir, c'est qu'en mémoire, à l'instant T, on n'aura qu'un seul des chiffres de liste.Ce qui va se passer, c'est que là, avec le MyGen,on a créé une règle de création, une règle de réflexion, pour générer nos 10 chiffres.
00:05:34 :Sauf qu'il va les générer à l'instant où ils sont demandés.C'est-à-dire qu'à l'instant où je crée ma variable A dans ma variable A, je crée MyGen,j'ai rien en mémoire si ce n'est ma variable A qui pointe vers la fonction MyGenet il va savoir l'utiliser pour créer la liste.
00:05:54 :C'est seulement au moment où je boucle que là, il va utiliser next, donc il va aller chercher la première entrée, donc le 0,il le charge en mémoire, puisqu'à l'instant T, on en a besoin,et lorsque je passe à la prochaine itération, donc au prochain next, le 0 est effacé de la mémoire et est remplacé par le 1.
00:06:14 :Et ainsi de suite.Comme je vous le disais, sur une liste de 10, on se dit, bon, on va gagner quand je suis en mémoire.
00:06:20 :Mais si vous commencez à traiter des données sur des listes de 5 millions ou autres items, ça devient vite important.Je vais vous reprendre un exemple que je vous avais déjà plus ou moins cité la semaine dernière.
00:06:34 :Lorsque j'ai fait mon script qui analyse les systèmes de fichiers Linux,quand on doit parcourir l'intégralité d'un disque de 1 ou 2 terrains qui est blindé de fichierset qu'on doit à chaque fois rechercher un fichier pour l'afficher, voir si c'est bien le fichier qui correspond,vous imaginez bien que là, si je crée une liste qui contient toutes les métadonnées de tous les fichiers
00:07:01 :et que je charge ça en mémoire, du coup, puisque pour la travailler, je suis bien obligé de la charger en mémoire vive,là, j'ai intérêt d'avoir un ordinateur quand même relativement costaud.
00:07:12 :Donc, à titre professionnel, on a des logiciels qui font plus ou moins ça.On compte des PC qui ont 64Go de mémoire vive et ils ramassent.
00:07:23 :Vous imaginez bien que quand on peut utiliser des petites astuces comme ça, tout de suite, c'est un peu gagnant.Le truc, c'est que là, par exemple, vous me dites, vous pourrez me dire,« Oui, mais tu refais ton orange-lis et au résultat des courses, on te fait la boucle. »
00:07:38 :Ce que je pourrais faire aussi, puisque c'est aussi l'un des avantages de l'itérateur,je pourrais boucler de cette manière-là.C'est-à-dire que là, je ne sais pas combien je vais avoir d'éléments dans ma liste et je vais faire ça.
00:07:51 :Vous allez voir ce qui va se passer.Voilà.En fait, là, il a imprimé, je n'ai pas fait d'erreur.Il s'est passé ce que je voulais.
00:08:04 :Là, il a imprimé les chiffres.Après, il est arrivé qu'il n'y avait plus d'itération.Donc, du coup, il m'a relevé une erreur.Stop itération.D'accord.
00:08:16 :Donc là, on pourrait boucler d'une autre manière qu'avec un while truejusqu'à ce qu'on obtienne l'erreur stop itération et à ce moment-là, on arrête.Ce qui fait que là, pour utiliser le générateur,on n'a même pas besoin de savoir combien d'éléments il pourrait y avoir dans notre liste.
00:08:32 :On va boucler jusqu'à ce qu'on lève l'erreur de stop itérationet là, on va la gérer pour éviter que le programme s'arrête.Donc voilà, en gros, sur les générateurs.
00:08:45 :Est-ce que vous avez des questions là-dessus ?Oui, si on allait jusqu'au bout pour lever l'erreur.Donc, tu le ferais dans MyGen, en fait ?
00:08:54 :Je le ferais.Ici, je pourrais créer une fonction.Alors, je n'avais pas réfléchi à cette option-là pour ce soir, mais...En fait, l'idée, c'est de terminer proprement sans avoir de crash.
00:09:06 :Je pourrais faire comme ça. Hop.Ah oui, voilà. Oui, d'accord. OK.Apply. Hop. Accept.Stop itération.Ça, c'est un mot-clé ?C'est une erreur qui est relevée.
00:09:27 :Oui, d'accord.C'est comme les NameError, ValueError...Oui, d'accord, d'accord.Que vous pouvez rencontrer lorsque vous faites vos scripts et qu'il y a des erreurs dans le script.
00:09:39 :Là, je peux, par exemple, mettre... Hop.Ah. Oui, voilà, oui. OK.Voilà. Et normalement, sauf si je me suis planté, si je fais ça...Et là, il continue, puisque je suis parti sur un breakthrough, bien entendu.
00:09:59 :Alors, par exemple, je pourrais que je fasse ça.Voilà. Un petit break.Voilà.Voilà.Et là, c'est l'urgence aussi. Voilà.Parfait.Donc là, par exemple, si vous pourriez avoir un itérateur que vous générerez, par exemple, ici, le range,vous pourriez l'avoir, je ne sais pas, moi, dans...
00:10:25 :Par exemple, l'end list item.OK.On va la définir, l'end list item, parce que sinon...Je vais le mettre là, par exemple.Voilà.Et puis dans le MyGen, vous passez un objet, une liste itérable.
00:10:56 :Et là, à ce moment-là, vous allez pouvoir itérer sur la liste et gérer ça en économisant la mémoireet sans avoir besoin de savoir à l'avance quelle est la longueur de votre liste.
00:11:08 :Et du coup, là, tu fais comment pour recommencer au début ?Parce que là, forcément, tu ne peux plus...Actuellement, ton code, il est fini, quoi.
00:11:21 :Tu ne peux plus relire dans MyGen, là, comme ça.Là, je ne peux plus relire ma liste d'items qui est dedans.Mais par exemple, ça, je pourrais le créer en en faisant un module.
00:11:33 :Tout bêtement.Alors, je vais faire ça.On va faire...Liste item.OK.Hop.Voilà.Qu'est-ce qu'il ne voit pas ?Je vais le faire comme ça.
00:11:55 :Voilà.Ce n'est pas très propre, ce que je fais là, mais c'est vraiment pour vous montrer l'idée.Hop là.Crac.Voilà.J'enregistre ça.Je vais créer un nouveau fichier.
00:12:16 :Côté.Test.Voilà.Je préfère importer mon fichier Montora.Il devrait me le trouver.Je ne suis pas dans un dossier bien défini.Bon.Je vais vous marquer comme ça.
00:12:58 :Je ne vais pas le mettre comme il faut parce que je n'ai pas créé le truc.Donc, je vais appeler ExecGen.OK.Et puis après, je pourrai, à plusieurs endroits de mon script, lancer ExecGen.
00:13:14 :Lui passer une liste avec divers items ou une liste qui aura été générée d'une autre manière dans le cadre de mon script.Et à ce moment-là, il retournerait dans le dossier Montora.
00:13:28 :Il utiliserait cette fonction.Et de cette fonction, il serait capable d'itérer sur la liste en question.C'est-à-dire qu'à chaque fois que tu vas vouloir recommencer cette itération, il va falloir repasser par la création du générateur.
00:13:42 :Ou il va falloir réutiliser ta même variable.Est-ce que c'est clair ?Montre-moi en réutilisant la variable.Tac.Et là, je peux refaire...Attends.Je ne sais pas si je peux...
00:14:17 :Si je fais comme ça, à mon avis, ça ne va pas marcher.Normalement, je pense qu'on arrive à la fin de l'itérateur et il ne va pas recommencer.
00:14:23 :On va vérifier ensemble. J'ai un doute.Hop.Je vais supprimer ça, sinon ça va me faire une petite erreur.Hop là.Voilà.Il va...Ouais.
00:14:47 :Forcément, il est arrivé au bout de l'itération, donc t'es obligé de récréer le générateur dans une autre variable.Je pourrais bien refaire à...MyGen.Et re-étirer à nouveau sur ce générateur.
00:15:04 :Est-ce que ça répond à ta question ?Une fois que t'es arrivé au bout de ton générateur...Alors, je n'ai pas les commandes en tête, je ne suis même pas sûr que ça existe.
00:15:16 :C'est un peu, si tu veux, comme quand tu lis un fichier.Oui, j'y pensais. Exactement ça.Un curseur, et quand t'es arrivé au bout du fichier, soit il faut revenir à zéro,soit il faut réouvrir le fichier pour remettre le curseur à zéro.
00:15:28 :Mais en fait, tu gardes le curseur là où t'en étais.Après, si tu dois utiliser un générateur, il vaut mieux l'utiliser, comme je t'ai dit,en créant une forme de module,et après en important ton module dans les différents scripts que tu utilises pour utiliser cette fonction de générateur.
00:15:50 :Après, une fois de plus, comme on discutait au début,on est sûrement sur la gestion de mémoire plus ou moins fine,et c'est vraiment pour optimiser son programme générateur.
00:16:05 :Il faut savoir que ça existe, savoir comment ça fonctionne,parce que ça, Autosa, par contre, ils n'oublieront pas de vous poser des questions dessus.Ils aiment bien.
00:16:15 :Mais, on va dire, dans la vraie vie, ça ne sera pas votre outil préféré.Est-ce que c'est bon pour vous ?C'est bon ? On passe à la suite ?
00:16:40 :Oups, là, je suis toujours connecté ou pas ?Oui, oui. Ah oui, oui. J'avais pas de réponse.C'est bon, Stéphane.Si vous me mettez le plus, je ne vois plus le chat quand je vous diffuse.
00:16:59 :Donc, du coup, si vous mettez des petits plus, je ne vois pas.Je suis déconnecté, ça fait dix minutes que je parle dans le vide.
00:17:07 :Quand on fait les pouces jaunes, tu ne les vois pas, c'est ça ?Voilà.Ah, désolé. Ah, d'accord, ok.Je vous avoue, vous m'avez fait peur. Je me suis dit, ça y est, je suis devenu fou, je parle dans le vide.
00:17:21 :Alors, hop, je vais mettre ça.Alors, maintenant, on va passer vite fait sur LRU Cache.Alors, LRU Cache, quel intérêt ?On va commencer par quelque chose d'assez simple.
00:17:40 :Ça.Hop là.Hop.Voilà.On va partir de cette petite fonction-là, d'accord ?Donc, rien d'exceptionnel, ok ?On est sur une fonction qui va nous retourner le carré d'un chiffre qu'on lui passe.
00:18:14 :Donc, si je fais ça, je me suis mis là, comment c'est ça ?Ah oui.C'est ça.Non.Bon, on va faire ça.Allez.Crac.
00:18:30 :Crac.Crac.Crac.Crac.Crac.Crac.Crac.Crac.Crac.Crac.Crac.Crac.Crac.Crac.Attends.Il faut que je retrouve la commande rapidement parce que je l'ai perdue.
00:18:53 :Ce n'est pas "-1", là, Stéphane ?Il me semble que c'était ça, mais apparemment, ça ne marche pas.Je lui disais, étendre "-m"."-m".Il est "-m", je veux dire.
00:19:08 :Peut-être.Attendez.Excuse-moi.Sinon, tu remontes dans l'history de ton ZSH ?Normalement, oui.Je vais retrouver.Mais j'ai passé beaucoup de commandes depuis.Ah, d'accord.
00:19:22 :Je joue avec le ZSH.On va essayer comme ça.Est-ce que du coup...Tac.Tac.Tac.J'aurais dû me la mettre de côté.Et puis...
00:19:44 :Forcément.Ah, voilà.Ah, ouais, d'accord.Je sais ce que j'ai fait comme bêtise.J'ai oublié que j'étais sur Mac.Voilà, ça marche mieux.Alors, là, on est dans un script.
00:20:18 :Pour que vous voyiez bien le LRUK,il va falloir que je passe par ce mode d'exécution-là.Alors, là, si j'utilise ma fonction return square...Deux.
00:20:35 :OK.Qu'est-ce qui se passe ?Qu'est-ce qu'il y a encore ?Sinon, je vais le faire comme ça.Je vais regarder si ça marche, là.
00:20:50 :Ah.Ça devait me faire pétiller l'exécution.Je ne sais pas si c'est moi, sinon.Voilà.Je sais ce qu'il se passe.Voilà.Ça devrait marcher, maintenant.
00:21:03 :Voilà.La résolution de la fenêtre a changé, là.Ouais, ouais, elle a changé.Bon, je vais faire autre chose.Je lance un test, là.On va voir si ça marche.
00:21:19 :Alors, pourquoi il ne veut pas ?Ah, oui, d'accord.OK, je sais.Je sais pourquoi ça marche.Alors, attendez.Je vais vous régler la résolution.
00:21:32 :Alors, qu'est-ce qu'il nous fait ?On va pouvoir faire ça.Ah, c'est moi qui ne gère pas bien les fenêtres.Windows peut bien avoir quelques avantages, quand même.
00:21:52 :Voilà.Ça devrait être un peu mieux pour vous.Parfait.Voilà, c'est mieux.Alors.Voilà.On va y arriver.Voilà.On ne va pas dire que ça a été facile.
00:22:27 :Allez.Donc, on y retourne.Donc, là, si je lance ma fonction éteinte polaire.J'ai une faute de 3 points de plus.On va faire avec le chiffre 2, par exemple.
00:22:40 :Là, j'exécute.Qu'est-ce qu'il se passe ?Il m'affiche le processing égale 2.Et il m'affiche le résultat.Jusque-là, rien de surprenant.Et si je recommence.
00:22:51 :Pareil.Il continue à exécuter la fonction.Jusque-là, on est bon.Il n'y a pas de différence par rapport à avant.Et maintenant, si j'utilise LRU Cache.
00:23:01 :Donc, LRU Cache, ça va plaire à Jean-Christophe,puisqu'il nous en parlait tout à l'heure.C'est un décorateur.D'accord.Je vais utiliser LRU Cache.Hop, alors, je vais sauvegarder ça.
00:23:15 :Voilà.On va sortir.Et on va relancer.OK.Donc, on recommence.On lance ma fonction.Et je l'exécute.Donc, pour l'instant, on a exactement le même comportement.
00:23:36 :Et c'est là qu'LRU Cache va interagir.C'est si je veux refaire ma fonction.Là, je pense que vous avez remarqué une différence de suite.Ah oui.
00:23:46 :Il n'y a pas de print.Il n'a pas printé.Alors, pourquoi ?Alors, en fait, LRU Cache,donc, ça vient du module Front Tool,c'est un décorateur qui va faireque lorsque vous exécutez une fonctionavec certains paramètres,il va enregistrer la valeur renvoyée par cette fonction.
00:24:06 :Ce qui fait que lorsque vous allez l'appeler une seconde foisavec les mêmes paramètres,au lieu de réexécuter la fonction,il va aller chercher le résultatpuisqu'il connaît déjà le résultat.
00:24:19 :D'accord.Et donc, il ne va pas exécuter son exercice.Si je comprends bien, Stéphane,il va prendre le cache.Voilà.Il va mettre en cache le résultat de la fonction.
00:24:32 :C'est fort, ça.Je me doutais que ça vous plairait.Oui.Et l'acronyme LRU, ça veut dire quoi ?Last Recent Use.Cache.Ah oui, oui, d'accord.
00:24:50 :Oui, cache.Ok, d'accord.Excellent.Voilà.Mais LRU Cache n'en a pas fini.Il a d'autres petites surprises pour vous.C'est un décorateurqui peut prendre en plus des paramètres.
00:25:03 :Donc, on va pouvoir indiquer,par exemple, la taille maximale.C'est-à-dire que là, par défaut,comme vous pouvez le voir, il est à 128.C'est-à-dire qu'il va être capable de retenirle résultat de 128 l'exécution de cette fonctionavec 128 paramètres différents.
00:25:23 :Par défaut.Mais vous pouvez aussi déciderde, par exemple, garder que les trois derniers.On va fixer le maxSize à 3.Ok.Donc là,si vous regardez ça, on va relancer.
00:25:42 :Hop, voilà.On relance.Donc, c'est mon résultat en square 2.Là, 2, il le connaît, il l'a fait.On va faire avec 3.3, il le connaît.
00:25:56 :Donc, si je fais 3, il me lance le résultat.Si je fais 2, il me lance le résultat.On va faire avec 4, du coup.
00:26:02 :Hop.Donc, 4, il connaît le résultat.2, il connaît le résultat.3, il connaît le résultat.Il repasse prévalprocessing.Maintenant, si je le refais avec 5.
00:26:17 :Ok, il a retenu 5.3, il l'a retenu, pas de souci.4, il l'a chassé de la mémoire.Parce qu'en fait, 5 était venu remplacer le 4.
00:26:29 :Oui.On a renouvelé le cycle.Voilà.Dès que vous en avez 3...Le tampon de la mémoire.Voilà.Quand il y a 3 tampons,là, on a mis un maximum de 3.
00:26:40 :Donc, quand il y a 3 cycles qui sont arrivés,puis qu'il y a une nouvelle fonction qui s'exécute,et bien, il va en supprimer...Généralement, il va supprimer la dernière qui a été utilisée.
00:26:49 :Mais avec le même paramètre, en fait.Voilà.À chaque fois, il faudra que ce soit...En fait, là, on va retenir 3 fois l'exécution de la fonction,avec 3 paramètres.
00:27:01 :Donc, on a 3 dernières utilisations de la fonction,avec 3 paramètres.D'accord.Si vous relisez le truc, là,on voit bien que le 4 avait été utilisé il y a un petit moment.
00:27:13 :Donc, du coup, quand j'ai rajouté le 5,il a viré le 4.OK.Après, le max size,ce n'est pas quelque chose que vous allez utiliser beaucoup.
00:27:25 :Ce que vous avez par défaut, c'est 128.Donc, quand on a une fonction qu'on commence à utiliser 128 foisdans le même programme Python,généralement, c'est une bonne fonction.
00:27:37 :On a bien fait de l'écrire, celle-là.Donc, il y a rarement besoin d'aller modifier ce chiffre-là.On peut éventuellement l'augmenter,parce qu'on estime qu'on l'utilise encore plus.
00:27:49 :Mais généralement, on ne s'embête pas à réduire ce max size.Sauf si, vraiment, on veut faire de la gestion assez fine de la mémoire.D'accord.
00:27:59 :Donc, en résumé, le TP d'avant, on optimise la mémoire.Et là, le TP actuel, on consomme un petit peu de mémoireau profit de la rapidité, si je comprends bien.
00:28:17 :On va gérer vraiment ce qu'on met en mémoire, ce qu'on ne met pas,et mettre vraiment ce qu'on a besoin en mémoire.Oui.D'accord.En fait, ça va permettre de gagner aussi, d'optimiser les temps d'exécution.
00:28:31 :Comme on avait vu la semaine dernière avec le Garbage Collector,quand on fait un gc.disable, on gagne du temps sur l'exécution.Alors, pour vous montrer ça...
00:28:42 :Pour moi, c'est le même.Oui.Si tu me permets, en fait, le Mark Size, si on met 3,le cache, c'est...En fait, le tampon, c'est lié à l'exécution de la fonction.
00:28:57 :Retourn, Score.Si je mets Mark Size 3,donc quand j'appelle Return une fois, deux fois, trois fois,là, quand c'est une fois, il renouvelle le cache.
00:29:07 :Ou bien, c'est quand j'appelle la fonction Return avec les mêmes paramètres.Quand j'appelle Return, Score 3, trois fois, il renouvelle le cache.En fait, je ne sais pas.
00:29:18 :Tant que tu tournes sur les trois mêmes paramètres, avec le Mark Size 3,il va garder les trois résultats de fonction avec ces trois paramètres-là.
00:29:27 :Par contre, tu utilises ta fonction avec un quatrième paramètre.Différent.Différent ou n'importe quoi.Différent, oui. Un paramètre différent.À ce moment-là,le premier des paramètres que tu avais enregistré, il va être viréau profit du nouveau paramètre que tu as enregistré.
00:29:49 :Ok.C'est une pile FIFO, en fait.First in, first out.C'est ça ?Voilà.Ok.Là, je vous ai montré que vous pouviez toucher au Mark Sizepour que vous compreniez un peu mieux le fonctionnement du LRU Cache.
00:30:09 :Maintenant, comme je vous ai dit, dans la réalité,le Mark Size, par défaut, est à 128.Ce sera largement suffisant pour vos besoins.Et vous n'allez pas avoir à le manipuler toutes les deux minutes.
00:30:21 :Après, sauf si vraiment vous êtes sur un énorme programmeet où là, vous allez chercher à mesurer précisémententre l'espace mémoire que vous utilisezet le gain d'optimisation en termes de vitesse d'exécution.
00:30:37 :Je vais vous montrer maintenant sur une autre fonction ce que ça peut donner.On va partir sur quelque chose d'un petit peu plus sympatoche.Hop.
00:30:52 :On va supprimer ça.Voilà.On va partir sur la fameuse suite de Fibonacci.Donc là, vous voyez, j'ai fait une petite fonction avec la suite de Fibonacci.
00:31:09 :On est parti sur un top 900 000.On va aller jusqu'à 900 000 avec la suite de Fibonacci.D'accord ?Là, on est sur quelque chose d'assez sympathique.
00:31:21 :On va regarder ça.Ok.On va la faire tourner une première fois.Ok.Il y a des gens qui ont des origines incoïtantes italiennes.Je ne suis pas sûr d'avoir bien écrit Fibonacci, mais bon.
00:31:42 :On lance.Voilà.Alors, je remonte parce que je vais mettre un return.Il faut qu'il y ait un return sur la fonction pour que ça marche,c'est-à-dire le cachement.
00:31:58 :Je n'ai pas précisé.Alors, mince.Le truc est trop grand.Alors, on va faire ça plutôt.Temps pour moi.Ça n'évite pas.Ce problème-là.Voilà.
00:32:24 :Donc là, on a mis 7 secondes pour exécuter cette suite.D'accord ?Maintenant, on va remodifier ça.Et on va rajouter notre petit décorateur magique.
00:32:36 :Et recache.D'accord ?On commence.Alors, hop.Je lance une première fois ma suite de Fibonacci.Donc, on a mis 7 secondes, comme tout à l'heure.
00:32:54 :D'accord ?Je recommence.Et là, c'est instantané.Excellent.Voilà l'un des gros intérêts de l'ERU Cache.C'est-à-dire que si vous avez une fonction qui nécessite de gros, gros calculs,vous savez que vous allez devoir utiliser cette même fonctionavec ces mêmes paramètres à plusieurs reprises.
00:33:15 :Donc, vous allez devoir utiliser cette même fonctionavec ces mêmes paramètres à plusieurs reprises.Vous mettez un LRU Cache sur cette fonction.Vous allez perdre le temps de calcul une fois.
00:33:25 :Et après, vous n'avez plus qu'à la repasser.Et c'est bon, quoi.D'accord.Non, c'est bon, Christophe.D'accord, d'accord.Donc, en fait, le décorateur LRU Cache, là,que tu as mis au-dessus de la fonction,en fait, il peut être à différents endroits de l'application.
00:33:50 :Et du coup, la fonction concernée sera mémorisée.Enfin, le résultat sera mémorisé.Là où je veux en venir, c'est quesi c'est bien le cas, il faut faire attention au LRU Cachesi on l'utilise plusieurs fois dans la même appli,à part définir le tampon, en fait.
00:34:11 :Voilà. Il ne faut pas en abuser non plus.Oui, d'accord.Et sur des fonctions, on va dire, qui sont un peu critiquesdans le programme,qui vont vraiment générer une grosse, grosse masse de calcul,là, l'utilisation du LRU Cache,surtout si on sait qu'on va devoir y revenir plusieurs fois,
00:34:30 :c'est plutôt intéressant.C'est-à-dire, par exemple,qu'est-ce qu'on pourrait imaginer ?On va imaginer une fonction qui va calculerla trajectoire d'une fusée, par exemple.Je ne suis pas pilote d'avion,je ne sais pas si parmi vous, il y en a qui ont approché l'aéronautique,mais quand on veut calculer les trajectoires optimum,
00:34:58 :il y a tout un tas de paramètres et de calculs à prendre en compte,donc là, ce n'est pas pour rien que la NASA et ainsi de suitedoivent être pionnés dans les gros ordinateurs,c'est qu'effectivement, ils ont besoin de puissance de calcul assez impressionnante.
00:35:12 :Imaginons qu'on ait une fonction qui soit en mesure de calculerune trajectoire idéale pour la fusée pour aller de la Terre à la Luneet qu'on doit utiliser ce résultat à plusieurs reprisesdans le cadre de notre programme.
00:35:26 :Là, on met le LRU Cache,on va faire ce gros calcul énorme une fois.D'accord ?Maintenant, on sait, alors pour reprendre mon exemple avec Fibonacci,A, mettons, c'est la Terre, B, c'est la Lune.
00:35:37 :Au lieu de faire la suite de Fibonacci et la calcul de trajet,on sait qu'à chaque fois que je vais récupérer des paramètresqui vont m'être retournés par ce calculpour le voyage de la Terre à la Lune,en ayant utilisé le LRU Cache,à chaque fois, je ne vais pas refaire le calcul à chaque utilisation,
00:35:54 :uniquement la première fois,mais par contre, lorsque je répérerai cette fonction,je récupérerai mes valeurs à chaque fois.D'accord.Mais on est bien d'accord qu'on peut l'utiliser,le décorateur et le LRU Cache,on peut l'utiliser à plusieurs endroitssur plusieurs fonctions dans la même appli.
00:36:16 :Tout à fait.Ça marche.Si on reprend l'exemple précédentoù tu avais return underscore square de X,ça aurait très bien pu être dans l'appli mentora.py.
00:36:30 :À la suite de notre exemple Fibonacci,ça ne pose pas de problème.Il n'y a pas de conflit.Il n'y aura pas de conflit.Il fait gérer le tampon même si on multiplie les appels.
00:36:46 :Voilà.D'accord.Je ne sais pas si on peut aller voir ça.On va essayer de voir.Si je ne me trompe pas.Voilà.Voilà.Là, on est dans la définition de LRU Cache.
00:37:02 :On se voit.Voilà.Voilà.Donc là, on voit qu'il va cacher les paramètres dans une fonctionet va renvoyer la fonction.D'accord.Donc en fait, ce qui se passe,c'est que quand on met LRU Cache sur la fonction,c'est comme s'il va modifier notre fonction d'une certaine manière.
00:37:37 :Et à ce moment-là,il va la...Il a des routes avec un pointeur.Il la transforme.Voilà.Il a des routes et la transforme.Et du coup, c'est comme si on appelait une autre fonction quelque part.
00:37:50 :OK.En gros, c'est comme s'il disait, par exemple,la variable B est égale à ce résultat.Et quand tu déclenches cette fonction,au lieu d'utiliser la fonction,tu renvoies la valeur de la variable B.
00:38:03 :On pointe sur B directement.D'accord.Wow.OK. Merci.Donc voilà ce que je vais vous montrer pour LRU Cache.Alors pour petite info,vous aurez tout ça dans le script que je vous mettrai demain,comme j'ai fait la dernière fois sur le Git.
00:38:20 :Ça, j'ai dû mettre cette petite infoparce que là, quand je commençais à travailler sur le range,il y a des limitations.Alors je l'ai sur Mac,mais je pense que sur Windows ou Linux,vous aurez le même genre de choses.
00:38:32 :Quand vous voyez le résultat du chiffre qu'on obtientquand on fait 9000 itérations de suite de Fibonacci,c'est un petit peu trop gros pour les mémoires,donc il a fallu que j'utilise,de stocker des chiffres plus grands, en fait.
00:38:45 :Ah, d'accord. OK.Voilà.Mais ça, sinon, cet import de 6et le setInMaxStringDigit,ça n'a strictement rien à voiravec le fonctionnement de LRU Cache.
00:38:59 :Je vais vous le montrer quand même pour être moins gourmand.Là, ce compte-là, hop,on peut le supprimer.On va relancer le script.Vous voyez ?
00:39:20 :Ça ne gêne pas du tout le fonctionnement.Là, c'était juste un truc que j'ai rajoutépour que vous puissiez voir un exempleavec un nombre énormeet voir justement la différence d'exécution.
00:39:31 :Oui, oui.Je ne savais pas qu'on pouvait faire ça.Merci.Voilà, voilà.Donc, en ce qui me concerne, j'en ai fini.Après, si vous avez encore des questions,n'hésitez pas à me dire.
00:39:44 :Merci.Non, c'est bien.C'est bon pour tout le monde ?Ou vous avez peut-être d'autres questions sur d'autres sujets ?D'autres petites questionsque vous voulez en profiter pour les poser ?
00:40:01 :Bon, peut-être moins, Stéphane.Je ne sais pas si le client a des questions sur le script.Alors, je vais leur poser des questions.Je ne sais pas si c'est possible pour vous, Stéphane.
00:40:13 :Je ne sais pas si le cache...Bon, là, il cache sur la mémoire de la machine.Oui.Et si, disons que, comme tu dis,on a une fonction qui demande assez d'espace de stockageet que là, il n'y a pas...
00:40:31 :En fait, je voulais savoir si on peut le faire,le cache sur une machine, en fait.Je suis sur la machine A,mais je veux faire le cache sur la machine B.
00:40:40 :Honnêtement, je te dirais queje ne sais pas parce que ça ne m'est pas venu à l'idée de pratiquer ça.D'accord.Mais comme ça, je te dirais que non,parce qu'on est quand même sur quelque chosequi va travailler avec la RAM de la machineet pas tout ce qui est ROM, disque dur, ainsi de suite.
00:41:00 :Donc, à mon avis, pour aller stocker la variabledu LRU cache sur un autre support distant,à mon avis, je ne vais pas te dire que c'est impossibleparce que je ne le sais pas,mais théoriquement, ça me semble plutôt compliqué.
00:41:16 :D'accord, d'accord.En fait, pourquoi je dois me passer des foiset que tu as une machine ici qui n'a pas assez de RAM,comme tu dis,et avec la séquence, tu veux peut-être faire le cache sur...
00:41:32 :Tu as une machine à distance,une virtual machine qui a assez de RAM, tu...Je vois ce que tu veux dire,mais à mon avis, je ne pense pas que ce soit possible.
00:41:42 :D'accord, d'accord.C'est quand même assez cool, ça, le LRU cache.C'est vraiment beau.Franchement, oui, c'est là qu'on voit que Python est quand même très complet.
00:42:01 :Là, on a vu sur les deux derniers mentorats que j'ai fait avec vousqu'on peut quand même pas mal jouer sur les paramètres et la mémoire.
00:42:10 :C'est vrai que Python a, on va dire,une réputation de pas être un langage de bas en termes de machine,un langage au plus proche du 0 et du 1,mais on voit qu'il offre quand même énormément de possibilitéset énormément de facilité pour gérer tous les aspects de notre machine.
00:42:32 :Oui, il y a moyen d'ouvrir le capotet faire les réglages à notre sauce en fonction de l'application.Effectivement.Moi, perso, ça fait quatre ans que je joue avec Pythonet les idées farfelues, je ne suis pas le dernier.
00:42:47 :Et jusqu'ici, il n'y a quand même pas grand, grand choseque je n'ai pas réussi à faire avec du Python.Ça veut dire que ça a été facile à chaque fois,mais il n'y a pas grand chose que je n'ai pas réussi à mettre en œuvre au bout du compte.
Aucune occurrence trouvée pour « ».