Générer des bons de commande avec Python
Session du 28 septembre 2023 à 20h00
Data Science & IA
Fichiers & Système
Algorithmique & Performance
Librairie Standard & Modules
Deviens membre Premium
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- +100h de formations
- +180 exercices de code
- +100h de mentorats en rediffusion
- 20 projets
- Mentorats groupés hebdomadaires
- Support individuel avec nos mentors
Générer des bons de commande avec Python
Exercices de création de bon de commandes .txt depuis un fichier excel. On verra du coup entres autres:
-
manipulation excel avec pandas
-
création de fichiers et utilisation de regex
-
optimisation avec du multi threading
00:00:00 :Ok, je vais partager mon écran.Ok, il y a du monde ce soir.Vous me dites quand vous voyezmon écran ?Oui c'est bon.
00:01:00 :Ok, très bien.Bon ben, je sais pas si...Salut Jean-Philippe.J'essaye de faire une tronche à peu près normalejuste pour la vignette et puis ça va être bon.
00:01:25 :Salut, salut à tous.Je vais enlever ma vidéo.Salut tout le monde.Salut Gabriel.Ah, je m'attendais pour commencer.Ok, du coup vous avez vu...
00:01:47 :En fait, j'ai oublié d'accepter les gens.Ok, je vois qu'il y a vraiment pas mal de personnes.Est-ce que vous pouvez dire dans le chat ceux pour qui c'est un premier mentorat,un peu, où est-ce que vous en êtes ?
00:02:07 :Ok, pas de soucis Gabriel.Dites-moi un peu dans le chat, parce que je ne suis pas sûr de reconnaître tous les pseudos.Peut-être que je les connais tous, mais je n'ai pas le droit de faire le détail.
00:02:20 :Si tout premier mentorat...Si tout premier mentorat, mais par rapport à Python, t'en es où de ta formation et tout ça ?Et t'as surtout fait quoi du Python ou t'as fait du Django et tout ça ?
00:02:41 :T'as déjà fait des projets ?Python 2.AZ terminé, ok.Ok, ça va, tu t'en sors, tu fais des projets.Un peu de Django, ok, pas mal.
00:02:59 :Et puis les autres, n'hésitez pas.Salut Yannis.Pareil, chacun n'hésitez pas.Interface graphique pour le boulot, ok, super.Donc ça va, tu commences à faire des trucs sympas.
00:03:16 :Les autres, n'hésitez pas à dire, pour ceux qui ont moins l'habitude de venir au mentorat,où est-ce que vous en êtes, c'est quoi votre niveau, ce que vous faites, etc.
00:03:28 :Et puis je regarde des messages de temps en temps, et puis jeu de rôle...Ah oui, ton fameux jeu de rôle, Gabriel.J'espère que vous suivez tous Gabriel sur Twitter.
00:03:42 :Il publie souvent des choses intéressantes sur le code ou parfois carrément autour de son projet,donc n'hésitez pas à suivre Gabriel.Mets-nous, Gabriel, ton pseudo Twitter pour que les gens te suivent un max.
00:03:59 :Un peu de data, Machine Learning Stream Unit, ok, super.Allez voir ce Twitter.Et du coup, Jean-Philippe, il n'y a pas de son, c'est que chez Jean-Philippe ou...
00:04:16 :Pardon, je dis Jean-Philippe parce que c'est ce que je vois sur le pseudo, c'est peut-être Jean-Philippe.Désolé, mais dites-moi...Mais je pense que vous m'avez confirmé que vous aviez du son.
00:04:32 :Ok, Christian, formation data, c'est avec quel organisme de formation, Christian, si ce n'est pas indiscret.Jean-Philippe, tu peux quitter et revenir sur la réunion, je vais te réaccepter, je pense que souvent ça règle les problèmes de son.
00:04:53 :Et ok, Wildcats School, c'était une formation longue ou...Trois mois intensifs, ok, c'est cool.En plus, dans un domaine, c'était quoi, tu dis, formation data, ok.
00:05:19 :Super, des belles choses.Bon, du coup, pour le programme de ce soir, je ne sais pas si vous avez eu le temps de voir, je vous propose de faire un truc un peu différent de ce qu'on fait d'habitude.
00:05:31 :Là, ça sera un petit peu moins avancé, je pense, peut-être un petit peu plus orienté débutant.Toutefois, on va voir du multithreading, donc c'est peut-être pas la chose qu'on fait...
00:05:44 :Ouais, deep learning, je suis d'accord avec toi que c'est intéressant.Ouais, donc le multithreading, c'est peut-être pas...Ah, c'est bon, c'est revenu, j'en suis.Ouais, un peu de panda.
00:06:00 :Ok, cool.Ouais, donc on va commencer par des choses qui sont peut-être un peu plus débutants, etc.Mais c'est toujours bien de revoir des choses qu'on a déjà vues.
00:06:12 :Et puis, on fera du multithreading.C'est un peu, je ne sais pas si ça vous parle, le multithreading, dites-moi dans le chat.Mais en gros, on peut faire deux choses.
00:06:25 :Il faut différencier le process et le thread.C'est pas pour accéder...A fortiori, oui, ça accélère l'exécution d'un script, mais c'est plutôt pour faire de la paralysation.
00:06:39 :En fait, typiquement, quand vous avez une fonction à appliquer sur une boucle,au lieu de faire une boucle et d'attendre que chaque itération de la boucle soit terminée,on va tout lancer en même temps.
00:06:51 :Donc on va faire du multithreading.Et on parle de multithreading parce qu'on parle de threads qui sont des processus logiques,et non des processus physiques.
00:07:02 :Le multithreading, c'est une chose, et il y a aussi le multiprocessing, qui est une autre chose.Là, nous, on va faire du multithreading parce que c'est assez simple à gérer avec Python.
00:07:11 :Le multiprocessing, c'est un petit peu plus compliqué, pour être honnête avec vous.Moi, dans tout ce que j'ai fait jusqu'à maintenant, j'ai utilisé le multithreading et non le processing.
00:07:19 :Là, typiquement, du scrapping, si tu scrapes plusieurs URL,typiquement, le multithreading, c'est parfaitement adapté.Donc, juste pour revenir au thread versus processure,par exemple, quand vous achetez un PC, on vous dit parfois deux cœurs.
00:07:39 :Donc, souvent, maintenant, les PC, les cœurs des processeurs,on en a deux, par exemple, si on a deux cœurs,chacun des cœurs peut aussi faire du multithreading.
00:07:51 :Donc souvent, si vous avez deux cœurs, vous allez typiquement avoir quatre processeurs logiques.Vous avez deux processeurs physiques, parce qu'ils existent vraiment dans votre machine,et chacun des processeurs est capable de gérer deux threads en même temps.
00:08:06 :Donc, si vous avez huit cœurs physiques, vous pouvez avoir 16 threads, etc.Et pour connaître le nombre de cœurs logiques et non-cœurs physiques,avec Python, on peut l'avoir facilement avec le module OS.
00:08:23 :Donc, si je fais ici, je vais chercher dans le Python.Ça va, vous voyez assez bien, j'ai fait zoomer encore.C'est pas mal, là, en tout cas.
00:08:32 :OK, merci, parce qu'après, c'est un peu chiant à gérer.Donc, vous faites un importe OS, tout simplement,et vous faites un os.count.cpu, il me semble.
00:08:45 :Non, c'est pas ça.Ça va être l'inverse, alors, cpu.count, oui.Huit, OK.Donc, ça veut dire que là, je peux faire huit threads en parallèle sur mon ordinateur.
00:09:05 :Donc, ce que je vous propose, c'est qu'en fait, on se fasse un petit exercice.Quand on fait les exercices, il nous faut de la data pour faire l'exercice.
00:09:17 :Donc, je vous propose, parce que ça fait partie de l'exercice,c'est de se créer un faux jeu de data.C'est toujours intéressant.On manipule un peu des fichiers, du Panda, etc.
00:09:29 :Non, le résultat, c'est le nombre de cœurs logiques.Donc, là, si tu vois huit, ça peut être...Bah, en fait, là, c'est sur le...C'est un MacBook MA, donc je suis pas trop à l'aise.
00:09:43 :C'est pas comme les processeurs Intel.Où on a, par exemple, deux cœurs physiques et deux threads par cœur, etc.Mais là, c'est... Donc, là, huit, le résultat, c'était le nombre de cœurs logiques.
00:09:57 :Version gratuite de Colab, j'ai pas...OK.Bah, voilà, tu peux faire deux threads.Après, tu vas voir que ça peut augmenter,ça peut réduire drastiquement le temps de ton script.
00:10:15 :Ça peut aller très vite.Donc, je vous propose, dans un premier temps,on crée le jeu de données, le faux jeu...Enfin, les fausses données.
00:10:22 :Donc, comme ça, on va manipuler un peu le module Faker.On va manipuler un petit peu Panda, DataFrame, PandaSerial, etc.Ensuite, en parallèle de ça,on va pas le faire en même temps, moi, je suis pas multi-thread.
00:10:35 :On va...Parce qu'ils sont indépendants, en fait, ces deux scripts-là.On va créer un peu le processus de...J'aimerais créer un bond de commande.Donc, je dis bond de commande, mais moi, j'y connais pas grand-chose là-dedans.
00:10:52 :Mais imaginons qu'en fait, on a un fichier Excel avec plein de data,et on veut créer un bond de commande pour chaque ligne.Un bond de commande, ce serait tout simplement un fichier TXTavec les informations des lignes du fichier Excel.
00:11:03 :Bon, voilà, c'est pas très compliqué,mais on peut avoir besoin de faire ce genre de choses.Donc, on va faire ces deux mécanismes-là,et ensuite, on va faire une boucle.
00:11:12 :Dans un premier temps, ça sera la méthode 1qui va nous créer les uns là-dessus des autres les bonds de commande.Vous verrez que ça peut prendre un peu de temps.
00:11:19 :Et ensuite, je vous montrerai deux méthodes de multi-threadingpour faire tout ça en parallèle.Voilà, est-ce que ça vous chauffe ?Ça vous tente ?
00:11:31 :OK, on va y aller.Vous m'arrêtez si ça ne va pas ou si vous avez des questions.N'hésitez pas.Pour ceux qui n'ont pas l'habitude des mentorats,voilà, j'avance, je fais des trucs.
00:11:47 :Si vous êtes perdus, n'ayez crainte,ça peut être normal,ça peut être un sujet qu'on ne maîtrise pas du tout.L'idée, c'est juste de découvrir les choses ensemble,comme ça, les jours où vous les revoyez,vous êtes plus à l'aise.
00:12:01 :Je me répète tout le temps, mais...Donc, ce que je fais quand on commence un projet,c'est toujours un environnement virtuel.Python, n, vent, vent.
00:12:12 :OK, on crée.Ensuite, je l'active.Source, vent, bin, activate.Et j'installe mes librairies.Donc là, moi, je vais installerFaker, Panda et Upython.Upython, en fait, ça me permet juste d'avoir un interpréteur Pythonun petit peu plus sexy à utiliser.
00:12:34 :Donc, ça nous lit, OK.Et j'ai remarqué, avec VS Code, en tout cas,quand vous installez Upython,il faut quitter VS Code et redémarrer,parce que sinon, il comprend pas.
00:12:46 :Il y a un problème d'indexation ou je ne sais quoi.Et ça galère.Donc voilà, je vous conseille, quand vous installez Upython,de faire ça.
00:12:58 :OK, donc là, je vais réouvrir mon dossier.Voilà, on va activer source, vent, bin, activate.OK, et là, on a tout ce qu'il faut, normalement.
00:13:16 :Je fais un plus pour vérifier.Voilà, donc on a bien Panda,on a Jedi, etc.Donc ça, c'est pour tout ce qui est coloration syntaxique sur Upython.
00:13:26 :Voilà, donc on est pas mal.Ce qu'on va faire maintenant, c'est qu'on va commencer justementpar quoi vous voulez commencer ?Par le template ou par les fake data ?
00:13:38 :Peut-être que c'est plus intéressant le template.Donc en fait, on va créer un template.Moi, c'est ce que je fais souvent quand j'en ai besoin.
00:13:47 :Comme ça, je n'ai pas à me créer à la main à chaque fois le fichier.Donc là, on va dire, imaginons qu'on se crée un petit template.
00:13:54 :Ça va être le bon de commande.Donc on va dire bon de commande.En fait, ce qu'il faut faire,c'est qu'il faut donner des patterns assez spécifiques.
00:14:13 :Comme ça, quand vous allez vouloir remplacer votre valeurdans votre bon de commande, ce sera simple.Je vous explique.En fait, là, on va mettre 3 étoiles.
00:14:25 :On va dire que le bon de commande, il est comme ça.Et puis, 3 étoiles.On va dire l'utilisateur qui a créé ce bon de commande.
00:14:40 :Utilisateur.Donc là, pareil, on va mettre 3 étoiles.L'utilisateur, on va dire, j'en sais rien.On va dire 4 U, comme ça.Et puis, on va mettre la date.
00:14:58 :Vous allez comprendre après pourquoi je fais ça.Ça peut paraître un petit peu bizarre.Et puis là, on va mettre...Items, carrément.Ça peut être tout.
00:15:28 :Moi, c'est juste que le template,il faut quand même qu'il ait le format du résultat que tu veux.Parce que sinon, tu vas voir ce qu'on fait après.
00:15:38 :Sinon, ça risque d'être un peu chiant.Donc là, on peut...En fait, dans votre template, vous mettez tout ce que vous voulez.C'est ça qui est bien.
00:15:45 :C'est que là, vous pouvez dire, j'ai un bon de commande.Et puis là, on va mettre les items ici, comme ça.Donc là, c'est notre template.
00:15:53 :Et on va déjà se créer un script.Create.Bc pour bon de commande.Donc là, ce qu'on va faire, c'est qu'on va dire...On va définir comme si on définissait un username.
00:16:09 :Donc on va dire...Je vais le mettre ici à droite, le template, comme ça.Donc c'est ce qu'on veut.Donc on va dire bon de commande.
00:16:20 :Bref.Bref.Bc.Là, je mets un truc au pif.C'est juste que là, c'est pour refaire le processus,pour faire comprendre un peu ce que je veux faire.
00:16:33 :Donc on va dire...Un truc au hasard, je dis une bêtise.Après, on a besoin du username.Donc on va dire...Groupe Panda.Et puis en date, on va importer time.
00:16:51 :Import.DateTime.Et puis on va dire...DateTime.DateTime.no.Et puis on va peut-être lui dire...Je veux l'année, le mois et le jour.Pas besoin de mettre l'heure.
00:17:12 :Ça ne sert à rien.Donc là, on a ça.Et puis, on va mettre nos items.Donc en fait, les items, on va dire...Ça va être les items du bon de commande.
00:17:24 :En fait, un bon de commande peut avoir plusieurs items.Donc là, on va dire...J'en sais rien.Si vous avez fait une commande Amazon,donc vous avez commandé une pizza,des bottes et puis...
00:17:35 :Allez, des frites parce qu'on est dans le Nord.Voilà.Donc ça, ça va être les itemsqu'on va mettre dans notre bon de commande.OK.
00:17:43 :Et là, ce qu'on va dire maintenant,c'est qu'on va générer notre template.Donc def generate pc.Donc là, on va prendre la REF,nos paramètres.
00:17:57 :OK.Et donc là, maintenant, ce qu'on va faire,en fait, on va tout simplement importer le template.Donc on va dire...Notre data, c'est...On va dire que c'est...
00:18:09 :Je mets data str pour dire que c'est une datasous forme de string qu'on va importer.Donc je ne vais même pas le mettre ici.
00:18:16 :On va dire with open...Donc là, notre fichier, il s'appelle comment ?Donc c'est template.txt.OK.Ici, le petit R,c'est pour dire que je veux ouvrir mon fichier en mode read.
00:18:32 :R pour read en anglais,ça veut dire juste lecture.En fait, ça protège un peu notre fichier.Si jamais on fait une bêtise,on ne va pas pouvoir écrire dedans.
00:18:40 :Imaginez que, je ne sais pas,le template, c'est l'équipe processqui vous l'a créé.Vous n'avez pas envie de modifier votre template,donc vous mettez read.
00:18:48 :Comme ça, vous allez ouvrir votre fichieren mode lecture uniquement.OK.As f.Et donc là, on va juste aller importertout ce qu'il y a dans notre template.
00:18:59 :Donc c'est tout simple.On va dire data.bc.On va même dire,comme ça on ne va pas se tromper,template.dataégal f.read.OK.Donc là, c'est bon.
00:19:17 :Merde.Je vais devoir dézoomer un peuparce que c'est un peu...parce que ça reste lisible pour vous.OK.Merci.Et puis moi, ce que j'aime bien faire ici,je le mets dans un if nameégal main.
00:19:42 :Et puis là, tout ça, je vais le mettre ici.OK.Et donc nous, déjà, on va regardersi on a bien récupéré tout ce qu'il faut.
00:20:02 :Retourne.Template.data.Et du coup,template.data égal generate.OK.Donc là, on va voir si ça fonctionne.Alors, c'est Codium, ici,l'autocomplétion intelligente.J'aurais aimé que tu parles de moi,mais non, en fait, c'est Codiumqui fait l'autocomplétion,et c'est pas moi.
00:20:35 :Donc là, je lance le script en mode interactif.Run.Create.PC.OK.Donc, si je vais voir template.data,vous voyez, on a vraiment récupérétout ce qu'il y a dans notre fichier.
00:20:52 :Vraiment tout ce qu'il y a.Donc là, il n'y a pas de surprise,et c'est juste sous forme de...P-A-I.C'est juste sous forme de string.
00:21:01 :Donc, vous voyez, ce qui est pas mal,c'est que je récupère aussitout ce qui est retour à la ligneavec le backslash n.Donc là, peut-être que maintenant,vous me voyez venir.
00:21:09 :Ce qu'on va tout simplement faire,et c'est l'intérêt d'un template,c'est d'aller remplacer le templatequi nous permet de créerla structure de notre document.
00:21:17 :On le fait une bonne fois pour toutes,comme ça, après, on ne le fait plus.Et ensuite, on va remplacerles valeurs qui nous intéressent.
00:21:23 :Donc, ici, je vais tout simplement,une fois que j'ai dit template.data,je vais dire template.data.replace.On sait qu'en fait,le bon commande,on veut le foutre ici dans notre template.
00:21:41 :Donc, il suffit de récupérerce pattern ici.Replace.Je vais le remplacer par la ref.Ensuite, il va me faire le user,la date et les items.
00:21:56 :Par contre, pour les items,ça va être un petit peu plusce qu'on voudrait.Nous, ce n'est pas un join virgule.On va mettre un backslash,comme ça, il va nous mettre à la limite.
00:22:07 :Je vais vous mettre virgule,comme ça, vous allez voir ce qui se passe.Et après, ce qu'on veut,c'est qu'une fois qu'on a récupérénotre fichier sous forme de string Python,on remplace, parce qu'en fait,pour manipuler un fichier,il faut que ça soit un objet Pythonavec lequel on puisse discuter.
00:22:25 :Et maintenant que c'est fait,on va tout simplement dire icinew data égale ça.Et après, maintenant,on va l'implémenter.New data égale.On va récupérer à chaque foisla mise à jour.
00:23:03 :Et maintenant, please open.Donc là, je ne vais plus mettre en lecture,je vais le mettre en écriture, justement.Donc, je vais utiliser W pour write.
00:23:18 :En fait, Yanis, c'est pour çaqu'on s'emmerde, entre guillemets,à importer ce qu'il y a dans notre fichier textedans une variable template data Python,parce que j'ai juste fait un read.
00:23:31 :Donc, j'ai récupéré dans une template.Et là, ce que je fais ici,je ne modifie pas du coup mon fichier,je modifie uniquement ma variableque j'ai importée.
00:23:40 :Je ne sais pas si tu vois le...OK.Sans rien que j'aille plus loin.Et donc là, ce qu'on va dire,c'est que le nom de notre fichier,on va lui donner le nom de la référence,par exemple.
00:23:54 :Donc, on va dire refbc.txt.Donc là, je le mets en mode,cette fois-ci, écriture.As F.OK.Et on va écrire notre nouvelle data.Et ce qui n'est pas mal,c'est que normalement,vu que j'ai importé avec, vous savez,les backslash N, etc.,
00:24:17 :il va me garder les sauts de lignecomme je voulais.Donc, OK.Ici, je fais ça.Et du coup, je n'ai plus besoinde retourner quelque chose.
00:24:29 :Moi, je mets toujours un retourne None.Comme ça, je sais que ma fonction,elle ne retourne rienet je n'ai pas de surprise.Donc là, vous voyez ici, sur la gauche,on va voir apparaître normalementle nouveau fichier.
00:24:41 :Donc, on fait run create monde command.Donc là, j'ai mon nouveau fichier.Le nom de fichier,il a le nom de la référence.Et si je vais voir,j'ai bien monde commandavec la référence que je veux.
00:24:52 :Utilisateur, groupe Panda,la date,et ici, pizza, bot, frites.Ici, ce que je vous disais,c'est qu'au lieu de faire un virgule join,je peux faire un backslash N,comme ça, au lieu de me créer.
00:25:10 :À la suite, il va me mettreun retour de ligne à chaque fois.Et donc, vous voyez ici que l'intérêt maintenant,ça ne va pas être d'en créer un seulparce que ça, ce que j'ai fait là,j'aurais pu le créer à la main.
00:25:23 :Nous, ce qu'on va faire,c'est qu'on va générerplein de références différenteset puis on va boucler dessus.OK ?Donc, pour faire ça,déjà, c'est bon pour vous,vous avez compris le concept,ce n'est pas très complexe,ce que j'ai fait,mais pensez-y,ça peut être un bon moyen d'imaginer,
00:25:50 :par exemple,vous voulez automatiser la création de facturespour des clients,vous pouvez vous faire un templatedans lequel vous mettezun template ici comme ça,vous mettez, je ne sais pas,le nom d'utilisateur, le prix, etc.
00:26:04 :Et puis, vous mettez des trucs un peu spécifiques.Pourquoi j'ai mis des trucs spécifiques ici ?Parce que, imaginez,si j'avais juste mis ça,si j'avais mis Bonds de commande égal B,quand j'aurais été ici dans mon truc,j'ai dit, en fait, naïvement,je veux remplacer tout ce qui est B ici,
00:26:31 :parce qu'ici, j'ai mis B,donc je veux remplacer Bpar un Bond de commande.Vous voyez que je le refais.Si je relance mon truc,on est content, ça a marché,par contre, il m'a remplacé aussi le Bde Bonds de commande,donc ça ne veut plus rien dire.
00:26:44 :C'est pour ça que,quand vous faites un template,il faut se mettre des trucs assez spécifiquespour les valeurs que vous voulez retrouver.En fait, ici, dans ce pattern-là,de mettre 3 étoiles, 4 B qui suivent,et 3 étoiles,je n'ai aucune chancede le remplacer quelque part ailleurs
00:27:02 :là où ça veut dire quelque chose.Je ne sais pas si c'est clairce que je dis,mais j'espère en tout cas.Voilà.OK, merci.
00:27:18 :Alors, maintenant,ce qu'on va faire,c'est qu'on va se créer un petit processqui va nous générer des fausses dataspour qu'on puisse s'amuser un petit peu,parce que je ne vais pas écrire à la mainà chaque fois l'arrêt,il faut username, etc.
00:27:31 :Donc, pour ça,vous connaissez sûrement,peut-être que vous connaissez,je pense qu'il y en a parmi vousqui connaissent, parce que...Oui, oui, ça peut remplacer...
00:27:44 :Ça peut remplacer dans Python,ça peut remplacer n'importe où.Qu'est-ce que tu veux dire par là ?C'est vraiment le principe d'un template, quoi.C'est comme le remplacerquand on fait remplacer dans Python,où c'est dangereuxparce que ça peut remplacer partoutdans le script.
00:28:06 :Ah oui, d'accord.Je vois ce que tu veux dire.Voilà, exactement.Même dans un fichier Excel ou quoi,si vous faites remplacer partoutet que ce n'est pas un patterntrès particulier,vous avez des risquesde faire de la merde, quoi.
00:28:16 :Ok, je vois ce que tu veux dire.Mais oui, c'est exactement ça.Donc, on va utiliser le module Faker.Vous le connaissez sûrement,mais oui, c'est possible de le faireavec un fichier Word,avec la librairie PyDocX.
00:28:33 :Ce que j'ai fait là,le read depuis le fichier texte,tu peux le faire un peu de la même manière,mais avec la librairie PyDocX.
00:28:42 :C'est pour ça que je parlaisde template de facture, par exemple.Vous pouvez écrire votre factureavec un fichier Word,même, je ne sais pas,vous avez votre logo en haut à gauche, etc.
00:28:50 :Vous le mettez,et après tout ça,vous le remplacez dans votre fichier.En fait, ce que je fais,c'est que j'importe en lecture,je modifie,et ma modification,je la rebalance dans un nouveau fichier.
00:29:02 :Si tu veux, Yanis,on pourra faire ça la prochaine foisavec un fichier Word.Pour le module Faker,ça permet de générer des fausses datas.
00:29:16 :Gabriel avait fait un article dessus,je crois même qu'il avait fait un post Twitter.C'est une super librairie.Import Faker.Alors,je ne sais pas,je n'ai pas encore installé.
00:29:33 :Là, je m'installe.Je vais vous faire juste une petite démode comment ça marche.Dites-moi dans le chat,ne me dites pas si vous connaissez,parce que je pense qu'il y en a beaucoup qui connaissent,mais dites-moi si vous ne connaissez pas,ça m'intéresse.
00:29:52 :From Faker Import.C'est un bon joueur ou pas ?Coucou.Tu laisses Gabriel travailler.Oui, elle a pris mon casque du coup,mais j'entends dans le PC.
00:30:19 :Du coup, j'en étais où ?À Faker.Là, j'ai mis Faker.Ce qu'il faut faire,c'est qu'il faut générer un objet de la classe Faker.
00:30:33 :Si vous faites fake.name,vous pouvez même mettre name femalepour avoir un nom de femme.En fait, c'est pas malquand vous voulez générer des fausses datas avec des boucles,vous n'avez pas besoin d'inventer des noms.
00:30:48 :Moi, souvent, j'invente des noms, c'est n'importe quoi.Comme le gros panda, vous avez pu le voir.Sean Anderson.Vous pouvez même dire,est-ce que c'est un nom anglais,est-ce que c'est un nom...
00:31:00 :Voilà, vous pouvez même, je pense,mettre des villes,même des dates.Si je mets date, voilà.Donc, nous, ce qu'on va faire,c'est que...Et vous avez vraiment plein de choses.
00:31:20 :Il y a des gens qui trouvent que c'est cool.Si je mets fake et que je demande,voilà, il y a vraiment plein de trucs.
00:31:28 :Vous pouvez avoir une couleursous format RGB, par exemple.Vous avez le tuple qui correspond à une couleur.Oui, tu peux spécifier des trucs assez sympas.
00:31:44 :Donc, nous, ce qu'on va faire,c'est qu'on va se créer des faux users,on va se créer des fausses références en boucle.Donc, je vais sortir d'ici.
00:31:52 :On va dire...Pour les références, je vais utiliser UID.Normalement, ça génère forcément un identifiant aléatoire unique.Ouais, c'est Hippiton qui fait ça.Avec Hippiton, je ne crois pas que ça marche.
00:32:18 :C'est pour ça que j'aime bien installer Hippiton,parce qu'il y a plein de choses de ce genre.Qu'est-ce que j'allais faire ?Des fois, je suis...
00:32:28 :Je disais quoi ?Ah oui, UID.Ah oui, UID.Import UID.Si je fais UID point...UID 1.Voilà, vous avez différents trucs.Pour générer un truc aléatoire, UID 3.
00:33:07 :UID 3.Vous avez UID 4.Sinon, ce que je vais faire, je ne vais pas m'emmerder,je vais utiliser Random.Random.Ah oui, il y a un petit truc aussi que je peux vous dire avec Random,c'est que si vous faites Import Random.
00:33:32 :OK.Si je fais Random point Rendit.Si je fais juste ça.Entre 1 et 100, par exemple.Même entre 1 et 1 000.Je ne sais pas combien, comme ça vous pouvez vous convaincre.
00:33:52 :S'il le fait à chaque point, je vais avoir un nombre différent,comme vous pouvez le voir.Alors qu'en fait, si je fais...Donc là, j'ai importé mon Random.
00:34:02 :Je fais Random point Seed 3.Et que maintenant, je fais Random Rendit.Là, ce n'est pas parlant, parce qu'il faut le faire avec une boucle.
00:34:14 :Vous allez pouvoir conserver le même nombre aléatoire à chaque fois.C'est juste un petit détail.Si jamais vous voulez faire des tests de vos scripts,je vous conseille d'utiliser ça.
00:34:25 :Moi, c'est ce que je fais.Random point Seed 3.Comme ça, je suis sûr que je vais générer les mêmes nombres à chaque fois.Et donc là, on va se générer nos références de l'ordre de commande.
00:34:39 :Donc là, au lieu que ça soit moi qui les génère,je vais dire que je vais faire Random point Rendit.OK.Donc là, on va s'en faire 10.
00:34:54 :Pour les Usernames, donc là, ça va être une liste.On va dire...Est-ce que je me suis créé de fakeur ?Non, je ne crois pas.
00:35:03 :OK.Donc, je vais dire...Oui, c'est ça.C'est à chaque fois que tu relances le script.Donc là, c'est pour ça que ça ne marchait pas dans l'interpréteur.
00:35:23 :C'est à chaque fois que ça marche au sein d'un script.Ici, on génère un objet fake pour générer les objets.Et puis, voilà.Donc là, on va dire Fake point Name.
00:35:41 :On va s'en faire 10 aussi.On va créer des dates pareilles.Fake point Date, on va dire 10.Et puis, en items, ceux-là, par contre,on va peut-être...
00:36:04 :Comment on pourrait faire ?Je réfléchis à qu'est-ce qu'on pourrait mettre comme items.Pour les items, en fait, on va s'en mettre plusieurs.Coca.Et puis, on va se mettre un t-shirt.
00:36:29 :Cul-au-verre.Voilà.OK.Donc là, maintenant, ce qu'on va se faire,c'est qu'on va se créer nos fake data.Déjà, on va vérifier que ça a bien marché.
00:36:47 :C'est bon.Donc, si je veux voir, par exemple, dans mes Refs,j'ai mes différents t-references,j'ai mes différents Username,j'ai mes différents Dates.OK.Et puis, j'ai mes items.
00:37:22 :Voilà.Donc, c'est pas mal.Je vais peut-être le mettre comme ça.Non, Faker, c'est un objet.En fait, tu vois ici...Là, j'ai créé une instance de la classe Faker,un peu comme tu crées une place et tu crées un objet.
00:37:45 :Donc là, Fake, c'est vraiment un objet.Et après, j'utilise les méthodesqui sont disponibles depuis l'objet Fake.OK.Donc, si je relance,je vais juste vérifier que j'ai les mêmes Refs à chaque fois.
00:38:02 :Donc là, vous voyez,le site m'a permis de générer à chaque foisles mêmes suites aléatoires.Et donc, maintenant, ce qu'on va faire,c'est qu'on va combiner, on va créer des...
00:38:17 :On va créer je ne sais pas combien de commandeset on va combiner aléatoirement, en fait, le Username.Voilà.Donc, en fait, on va dire...
00:38:29 :Combinations.J'imagine, ouais, il faudrait aller regarder dans le code,mais il doit y avoir...Il y a pas mal de Random là-dedans.À mon avis, tu as une liste énormede données disponibleset il fait des combinaisons un petit peu plus...
00:38:54 :conditionnelles grâce à Random.Ah, très bonne question.Est-ce que le seed...Je ne pense pas, parce qu'en fait, là, le seed que j'ai mis,je l'applique uniquement au module Random.
00:39:08 :Mais peut-être que...Attends, je vais voir si...Est-ce qu'il y a un seed ?Ouais, on peut définir un seed pour le Faker aussi.C'est une bonne question.
00:39:24 :Mais bon, là, je ne vais pas le faire.Je vais garder la liste qui est créée à l'exécution.Alors, on va se faire une combinaison.
00:39:35 :Donc, maintenant, on va se dire...InRange...Combien on va se faire de bons de commande ?On va se dire qu'on va s'en faire 50.
00:39:45 :Sachant qu'un bon de commande,c'est une référence de bon de commande,mais dans le bon de commande,on peut avoir plusieurs fois un même utilisateurqui commande des items différents.
00:39:58 :Donc, on va dire...Je vais faire une liste plus petite.OK.Combination.On va dire que notre data,ça va être un random choice.Je vais créer un dictionnaire, en fait,où on va définir la référence...
00:40:34 :En fait, la référence du bon de commande,ça va être celui qui est aléatoire.Ouais.Je n'ai pas besoin ici.Je vais le mettre là.
00:40:48 :Data.Du coup, on va l'appeler BCF.Là, ça va être random.On lit entre 1 et 100.On va se dire...Moi, ce que j'aime bien faire aussi,c'est le garder en format...
00:41:09 :Comme ça, j'aurai trois digits.OK.Le bon de commande, ça va être...Donc, on va en avoir 50 différents.Et ensuite, ce que vous pouvez faire,c'est définir, grâce à random,dans une liste,le random choice username,ça permet de choisir un nom au hasarddans une liste.
00:41:29 :Vous voyez, si je fais ça,il va me choisir à chaque fois un différent.Parfois, il choisit le même.Mais voilà, le random choice dans une liste,ça permet de faire ça.
00:41:40 :Du coup, tu peux faire des items...Ouais, voilà.Et c'est grâce au random choiceque je vais faire un item aléatoire.Et ici, c'est pareil.
00:41:48 :Tu vois, dans les items,je mets K égale 5parce que je vais en prendreune, deux, trois, quatre,un, trois, quatre, cinq.En fait, ce que je vais dire,c'est que tous les bons de commanden'ont pas le même nombre d'items.
00:42:06 :Donc, ce qu'on peut dire,c'est que random.randit...Et donc là, on va prendreentre un et cinquième élémentpour chaque bon de commande.OK.Et une fois que j'ai créé ma data,je vais juste combination,append data,et puis on va aller voir ce que ça donne.
00:42:27 :Donc là, il m'a créémes bons de commandesous forme de liste.Voilà.Je pense que les bons de commande...Parce qu'après, moi,je voudrais transformer ça en...
00:42:45 :Je vais garder un nombre constantparce que je veux avoir le même nombreet puis ça va être peut-être un peu chiant.Je vais même le faire en coins.
00:42:54 :Je vais...Je vais joindre sous forme de...de string pour avoir un seul élémentsinon ça va être chiantquand je vais le formater.Je relance.
00:43:07 :Il y a un truc qui ne va pas.OK.Donc, je vais voir ma combination.Donc là, j'ai un dictionnaireavec à chaque fois trois items dedans.
00:43:18 :Tout ce que je veux.Et moi, ce que j'aime bien faire,c'est quand j'ai une liste,je la transforme en DataFrame.C'est plus simple à voir.
00:43:26 :Donc là, on va dire...Combination.Je vais directement l'implémenter.pd.DataFrame.Combination.Il faut que j'importe.Import.Panda as pd.On va dire...df. Combination.
00:43:47 :Comme ça.On aura accès aux deux.Je relance.bx.OK.Et donc maintenant,si je vais voir...Donc, Combination,c'est toujours mon dictionnaire.Et si je vais voir df. Combination.
00:44:06 :Voilà.J'ai en fait transformé ma listesous forme de dictionnaireun petit peu plus lisible.Ou en fait,ça me donne un espèce de tableau.
00:44:13 :Et j'ai...Pourquoi il y en a plus qu'un seul ?Ah oui.Parce qu'ici, par contre,je lui ai bien dit...OK.Ça marche assez bien.
00:44:23 :Pas mal.Donc là, j'ai sous forme de tableaumes fausses données.Donc, un bon de commande à chaque fois.Avec un nombre aléatoireentre 100 et 99.
00:44:36 :Juste le petit problème,c'est que c'est peut-êtrepas forcément unique.C'est pour ça que je vais plutôt utiliserle UID.Désolé pour ça.UID.Et là, je ne vais pas mettre un random.
00:44:50 :Parce qu'en fait,on peut se retrouver avecdeux bons de commandesqui seront équivalents.Et ça, ce n'est pas ce qu'on veut.Et voilà.Donc là, on a notre référencede bons de commande.
00:45:06 :Elle est un petit peu barbare,mais c'est comme ça.Et avec nos colonnes.Donc là, on est content.Et donc là, maintenant,ce qu'on aimerait,c'est créer directementtous les bons de commandeslà-dessus.
00:45:21 :Donc, ce qu'on pourrait faireun petit peu naïvement.Et en fait,je n'avais peut-être pas besoinde créer un data frame.J'aurais pu le laisser directementen combination.
00:45:34 :Donc là, maintenant,ce qu'il va falloir que je fasse,c'est que je vais directementmettre ma combination.Et puis, je peux même mettre,je pense, ici,Combination.
00:45:51 :Donc là, c'est une seule combination.Et là, le réf bon de commande,ça va êtreCombination BCRF.Combination Username.Combination Date.Et ici, les items,c'est un petit peu plus compliqué.
00:46:12 :Maisvoilà, pour l'instant,je vais le laisser comme ça.Combination Items,et puis on verra plus tard.Et là,on va mettreCombinationBCRFTXTOk, donc là,je vais peut-être en faire moinsparce qu'on ne va peut-être pas tout voir.
00:46:40 :Je vais en faire 5 seulement.Ok, donc, voilà.Oui, UID, c'est un identifiant uniquegénéré automatiquement.Ok, donc là,maintenant, on va dire quefor combination incombination.
00:47:06 :En fait, ça, j'en ai plus besoin.On en a pas besoin,mais bon, c'est juste pour vous représenter un peules datas.Et donc là, on va direGenerate bon de commande.
00:47:14 :Combination, ok.Donc là, si je lance,vous allez voir ici apparaîtretous les fichiers textes qui se créentles uns à la suite des autres.
00:47:22 :Créer de commande.Voilà, donc il me les a créés.Je pense que ce que je vais faire même,c'est je vais les numéroter.Enumerate.Non, je ne vais pas faire ça.
00:47:40 :Là, vous voyez,ah oui, je vais rajouter un timer dedans,comme ça, on va faire comme si,parce que tout à l'heure,par exemple, Yanis, il disait,j'ai une fonction qui est très longue.
00:47:48 :Là, vous voyez que c'est très rapide,même si je l'ai fait les uns à la suite des autres.Bon, voilà, on ne s'emmerde pas trop.
00:47:54 :Ça va vite.On ne va pas se faire chier à faire du multiprocess.En fait, on fait du multithreadingquand ça commence à prendre pas mal de temps.
00:48:01 :Donc là, je vais simuler le faitque ça prenne du temps.Donc je vais faire import timeet là, dans la fonction, à la fin,je vais lui dire time.sleep
00:48:12 :et je vais lui direque tu vas dormir pendant deux secondes.Donc tout ça, je vais l'enlever.Je vais peut-être juste renommer mon fichierpour qu'il se retrouve à la fin,sinon ça fait chier.
00:48:24 :Hum...Ok, et puis...Ouais, ok, ça a marché.Donc là, on a bien notre pont de commandemais bon, par contre,il y a toujours le petit problème du template.
00:48:50 :Ok, j'ai gardé.Bon, tout ça, je vais les supprimerpour vous montrer ce que ça donneavec le sleep, le time.sleep.Donc là, vous allez voir qu'en fait,c'est un petit peu plus longparce que tout simplement,en fait, je lui ai dit de s'arrêterdeux secondes à chaque exécution de fonction.
00:49:08 :Donc si je run...Ah oui, forcément, j'ai changé le nom du fichier.Et puis je vais même mettre un print.Comme ça, vous allez voir comment ça se passe.
00:49:18 :Hum...Print...Hum...Voilà.Print, run, create.Voilà, donc là, en fait,il crée le truc, il dort deux secondes.Voilà, ça peut être un peu long,surtout là, j'en ai mis que cinq,mais imaginez, j'en ai dix.
00:49:46 :Voilà, ça va prendre 20 secondes.Et un programme qui dure 20 secondes,ça commence à être un petit peu important.Voilà, je vais mettre dix,comme ça, vous allez voir à quel pointça peut être long.
00:49:57 :Donc ça, je supprime.Hum...Juste pour que vous vous rendiez compteà quel point l'outil SWOT peut être puissant.Hum...Et on va même mettre un compteur de performance.
00:50:14 :Hum...Je vais le mettre avant, ici.Je vais mettre s égale time point perfcounter.Ici, je vais mettre la fin.Donc time point perfcounter.Et puis, on va printer le temps que ça a mis.
00:50:34 :Donc e moins s.Voilà.Ici, je reviens.Juste pour vous montrer,donc là, c'est le script 1, en fait,celui qu'on ferait un petit peu naïvement au début.
00:50:49 :Donc j'ai lancé.Ça tourne.Avec les fichiers qui se créent ici sur la gauche,un par un.Donc voilà, à peu près 20 secondes,parce que je le fais dormir deux secondeset je le lance dix fois,donc ça me paraît cohérent.
00:51:14 :Voilà, donc vous êtes d'accord avec moique c'est un petit peu chiantet c'est trop long, c'est pas optimal.Et vous êtes d'accord avec moi aussi,est-ce qu'on a vraiment besoin qu'un fichier soit créépour en créer un autre ?
00:51:29 :On n'a pas besoin, parce qu'en fait,c'est pas comme si on utilisait le résultat de la book précédentepour continuer notre process.Donc on peut très bien se dire,je suis capable de paralléliser mon exécution.
00:51:42 :Donc pour ça, on va importer le module qui s'appelle Threading,qui est built-in.En fait, j'ai besoin de rien.Je n'ai pas besoin d'installer une bibliothèque.
00:51:54 :Et donc ici, au lieu de faire une boucle un petit peu...qui n'est pas...qui n'est pas terrible,qui n'est vraiment pas terrible,ici je vais la remettre...
00:52:09 :Donc là, en fait, on crée notre combination.C'est cette boucle-là qui n'est pas optimale,et c'est cette partie du script qu'il faut qu'on optimise.Donc là, je vais la mettre...
00:52:27 :je vais la commenter.On va rester ici dans notre performance.Donc là, maintenant, ce qu'on va faire,c'est qu'on va créer des threads,donc différents process logiquesqui vont permettre de paralléliser un peu notre...
00:52:41 :notre processus.Donc pour ça, ce qu'il faut faire, c'est que...pour chaque élément qui sont dans notre combination,donc for combination...in combination,donc ça, c'est toutes les combinaisons qu'on veut faire,on va créer un nouveau thread.
00:53:06 :Donc on utilise le module threading,on dit thread,target, c'est pour dire quelle fonction on veut lancer,quel process, en fait, on va vouloir faire.
00:53:16 :Donc nous, ce qu'on veut faire, c'est générer un bond de commande.Et ici, vous pouvez lui passer des arguments à votre fonction.Nous, notre fonction a des arguments qui sont la combinaison.
00:53:26 :Vous en aurez toujours au moins un, sinon il n'y a pas d'intérêt.Maintenant, une fois qu'on a créé le thread,on va le lancer,et on va aussi...
00:53:37 :il faut que je crée d'abord...je le fais et après je vous explique ce qu'on fait.Il faut que je l'ajoute...threadings.append.tOn le démarre, et après on va faire un truc,un join, je vais vous l'expliquer après à quoi ça sert.
00:54:01 :Je vais essayer de l'expliquer plus clairement.Et donc là, ce qu'on a fait, c'est quepour chaque élément qui sont dans la combinaison,on crée un processus logiquequ'on va vouloir démarrer.
00:54:16 :Je vous explique ici pourquoi après on l'ajoute.Pourquoi la ligne 51 et la ligne 53-54,je vous explique après à quoi ça sert.Là, concentrons-nous sur la création du process logique.
00:54:27 :En gros, on veutexécuter notre code sans attendre quetous les process soient terminés.Et ici, on démarre.Donc là maintenant, si je lance comme tout à l'heure le script,mais avec le multithreading,vous allez voir qu'ici à gauche,ils se sont créés tout d'un coup en même temps.
00:54:47 :Parce que je n'ai pas attendu que chacun soit terminé.Et vous voyez le temps d'exécution, c'est 2 secondes.Là où tout à l'heure c'était 20 secondes.
00:54:56 :Typiquement, si vous avez une boucle énorme,je vous conseille de faire du multithreadingparce qu'en fait, il va paralléliseravec les threads qui sont disponibles.
00:55:05 :En fait,avec la boucle simple,il n'y a pas de...Il n'y a aucune...Bah oui, je suis d'accord, c'est incroyable.En fait, il n'y a pas de...
00:55:29 :Il n'y a pas de parallélisation.Quand tu lances ton script Python,le script main,donc en fait celui,quand je fais ici,run, create,bon de commande,ça crée un processus logique.
00:55:43 :C'est le processus logique principal.Oui, le time slip,il est toujours présent.Et c'est d'ailleurs pour ça quele processus global met 2 secondes.Parce qu'en fait,c'est comme s'il faisait...
00:55:58 :Tu vois, je ne l'ai pas triché.Ici, je l'ai enlevé.C'est comme s'il faisait...Et le print, je le mets après le 2 secondes.Donc c'est pour ça qu'il apparaît après.
00:56:08 :C'est comme s'il faisait en même temps10 fois un truc qui met 2 secondes.Donc forcément,c'est un peu l'histoire du parallèleet de la série.
00:56:19 :Il les envoie tous en parallèle.Donc 2 secondes en parallèle,même si tu en as 10 ou 100,si c'est en parallèle,ça reste 2 secondes.
00:56:27 :Si c'était en série,c'est-à-dire l'un à la suite des autres,ça serait 2 fois 100.Ou 2 fois 100 plus 2.Mais comme il les envoie tous en parallèle,forcément, tu ne vois qu'une foisle temps d'exécution.
00:56:42 :Et donc, ce que je disais,c'est que quand tu lances un script,ça crée un processus logiquesur lequel va tourner ton script.Or ici, on a dit,n'attends pas que le processus...
00:56:57 :Et si tu n'as qu'un seul thread,tu ne peux pas paralléliser.Donc tu es obligé d'attendrequ'au sein du même thread,tu es obligé d'attendreque chaque itération de la bouclese termine pour pouvoir continuer.
00:57:07 :Alors que si tu as parallélisé,tu peux dire...En fait, c'est comme si tu les initialisais.Ça veut dire que pour chaque élément de ta liste,tu crées un processus logiqueet tu n'as pas besoin d'attendreque chacun se termine pour commencer l'autre.
00:57:25 :Tu les commences tous en même temps.Là, en l'occurrence,ils se terminent tous en même tempsparce que c'est deux secondes,mais des fois, tu as des fonctionsen fonction du combination.
00:57:34 :Peut-être que ça peut êtreplus ou moins long en fonction.Donc ils ne vont peut-être passe terminer tous en même temps,mais au moins, ils auront tousdémarré en même temps.
00:57:41 :Et tu gagnes un temps fouparce que tu paralléliseset tu profites des multiscriptsque tu as dans ton ordinateur.Ici, ce que j'ai mis ici,ce n'était pas obligé.
00:57:53 :Si je mets ça,et que j'appuie dessus,ça va fonctionner de la même manière.Bon, ici, je peux,pour vous en convaincre,je peux supprimer tout ça.
00:58:06 :Si je relance,donc là, vous voyez,tous créés en même temps.Et ce que vous pouvez remarquer,par contre,c'est que là,il y a l'air d'avoir un petit problèmeavec l'exécution de chacun des threads,donc de chacun des process logiques,et l'exécution du thread global.
00:58:26 :Parce que, comme je vous l'ai dit,quand vous lancez un script,en gros,vous avez votre process logique principal,qui est en fait le script lui-même,et tous les process logiquesque vous voulez lancer en parallèle.
00:58:37 :Ici, comme, en fait,cette fonction-là, join,bon, elle est un petit peu,c'est un petit peu compliqué à comprendre,mais en gros,quand vous dites join,ça veut dire que le process principal,donc le processus logique principalqui est le script lui-même,il va attendre que tous les process parallèles
00:58:56 :se terminent pour pouvoir se lancer.Donc c'est pour ça que,si je ne mets pas ça,en fait,ici, vous voyez que c'est une instructionqui vient du process global,qui est en fait le script principal.
00:59:11 :Là, quand je fais print E-S,c'est une instruction du script global.Donc c'est pour ça que,si je ne mets pas ça,dès que je lance mon script,en fait,il me balance tous mes threads,mais il n'attend pas qu'ils soient terminés.
00:59:27 :Donc, forcément, lui,son instruction,elle arrive avant les deux secondesque j'ai mises ici.Donc avant n'importe lequel des threadsque je lance en parallèle.
00:59:38 :Donc, comme il n'attend pas,lui, en fait,il balance son instruction,et c'est pour ça qu'elle apparaîtavant que les autres se terminent.En revanche, ici,si je remets l'instructionqui permet de dire au script principal,tu attends que tous les threads parallèlessoient terminés,vous allez voir qu'il va attendre
00:59:56 :que tous les threads soient terminés.Donc c'est ici le printde l'exécution de l'écriture du fichier.Et ensuite, quand ils sont tous terminés,il se permet d'écrirele temps écoulé.
01:00:14 :Voilà.Moi, ça me sert beaucoupparce qu'en fait,comme je fais beaucoup de simulations numériques,etc., et que je fais du post-traitement,j'ai souvent besoind'écrire mes résultats dans des fichiers.
01:00:30 :Et en fait,vous imaginez ici quelà, ce n'est même pasle time.sleep.En fait, ça peut être le temps de ma simulation.Je n'ai pas envie d'attendreque ma grosse simulation soit terminéepour pouvoir écrire mon fichier.
01:00:45 :Si, par exemple, j'ai une toute petite simulationqui ne dure pas longtemps,je veux avoir le résultatavant que la grosse simulation soit terminée.Ça, c'est une bonne question, Pierre.
01:00:56 :C'est un peu une des autres chosesque je voulais montrer.Il y a aussi un moyen de faire ça.Si vous faites importc'est concurrent.future.
01:01:13 :En fait, au lieu icide le laisser prendre à dispositiontous les threads qui sont dispos,on peut,donc ça, je vais peut-être le commenter.
01:01:24 :Ce qu'on peut lui dire,c'est qu'on peut créer un pool de threadset on peut lui dire,tu en mets seulement six.Six à la fois, comme ça.
01:01:43 :Par exemple, si vous voulez continuerde bosser sur votre PC à côté, etc.et que tous vos process logiquesne sont pas bouffés,vous pouvez lui dire ça.
01:01:53 :En gros, là, ce qu'on dit,c'est qu'il va créer un pool.Un pool, c'est comme s'il faisait une queueavec des process qui attendent d'être lancés,mais dans la limite de six.
01:02:07 :Après, vous n'en faites paspour la syntaxe de ce truc-là.C'est juste un truc à connaître.Et voilà, il va gérer la concurrence des threads.
01:02:16 :Et en fait, ce qu'on lui dit juste,c'est que map,je ne sais pas si vous connaissez,c'est quelque chose qui permetd'appliquer une fonctionà plusieurs éléments d'une liste,à un itérable.
01:02:26 :En fait, on lui dit,pareil, tu me gères le multiprocess,donc tu balances les arguments de combinationà ma fonction de générer de bonnes commandes.
01:02:37 :Et donc là, c'est pareil,en fait, il marche pareil.Mais bon, du coup,là, on ne va pas le ressentir,mais potentiellement,il pourrait aller moins vite,parce que je lui ai dit seulement six workers,alors que quand je le laisse faire,forcément, il va me balancer huit threads,
01:02:54 :parce que j'ai huit threads disponiblesdans mon truc.Donc là, vous voyez,il commence par en faire six.Je ne sais pas si vous avez vu,je vais peut-être mettre plus de temps.
01:03:11 :Je vais mettre plus de temps,comme ça, on va voir.Je mets quatre secondes de tempsentre ces trucs.Je relance.Donc là, vous voyez,il en fait six d'un coup,et après, il fait les autres qui restent,donc il me fait les quatre autres.
01:03:33 :Donc, on se retrouve avec huit secondes,parce qu'en fait,il a réussi à faire deux groupes dans son pool.Voilà, j'espère que je ne vous ai pas trop...
01:03:48 :Mais du coup, oui, c'est une bonne question,et c'est comme ça qu'on peut gérerle nombre max de threads à allouerà notre processus.Mais sinon, si tu ne le fais pas,oui, il se débrouille tout seul,et il va un peu bourriner,quand même, il faut faire attention.
01:04:07 :En fait, soit tu le gères ici,parce qu'en fait, tu vois là,j'avais créé autant de threadsque de combinaisons,donc si j'avais voulu,j'aurais pu limiter la taille de ma listeà huit, par exemple.
01:04:25 :Ou sinon, tu le gères comme ça.Moi, je préfère le gérer comme ça,au moins, je sais qu'il ne va pas utiliserplus de six threads parallèles.
01:04:33 :Et voilà.Est-ce que ça a été clair pour vous ?C'est un concept un petit peu complexe,mais en vrai, vous voyez qu'en termesde lignes de code,ce n'est pas non plus énorme.
01:04:51 :Et si je vais voir,je n'ai même pas été voir mes trucs,mais vous voyez qu'on a bien...Alors ici, pourquoi il me fait ça ?
01:04:59 :Il y a une petite couille.Ouais, parce que ici,je n'ai pas mis dans le templatece qu'il fallait dans mon fichier.Pendant que je fais ça,je vais se préparer à des petites questions,si vous en avez.
01:05:32 :Donc, OK, merci pour vos retours.C'est cool si ça vous a plu.Si tu fais ça pour la facturation,on peut faire du public postageet l'envoyer par mail directement.
01:05:44 :Ouais, en fait,typiquement dans ta fonction ici,tu pourrais te dire que tu finis...Donc, tu fais ton...Tu crées ton fichier.Après, peut-être que tu peux te mettreun try-except pour vérifierque ton fichier a bien été créé.
01:05:59 :Et après, tu le balances en argumentdans une autre fonctionqui va t'envoyer l'email.En fait, moi, ce que je te conseillerais,c'est par exemple,si tu as 100 bons de commandes à faire,tu génères d'abord tes 100 bons de commandeset après, tu fais tes envois d'emailen parallèle aussi, pareil.
01:06:15 :Mais après, attention à ce genre de trucsparce que si vous envoyez des emailsavec ce genre de script,il y a des chances que ça arrive dans les spams.
01:06:26 :Mais bon, ça, après, c'est un autre problème.Mais oui, tout à fait possibled'envoyer par mail directementtes différents bons de commandes.T'as les librairies SMTP libre, je crois,qui permettent...
01:06:41 :Tu configures tes identifiants SMTP,ton serveur SMTP, etc.Et puis, avec Gmail, ça marche très bien.Voilà.Et en fait, s'il y a des chosesque vous devez retenir ici,c'est un peu la logiqued'avoir un template.
01:06:59 :Et puis, vous voyez ici,je me suis fiché une foisaprès mon templateet puis j'ai pu générer 10 bons de commandes.Comme ça, je vais relancer avec mon templateet j'ai pu générer 10 bons de commandesà partir d'un template.
01:07:13 :Donc, retenez ce process là.Vous pouvez l'appliquer sur un fichier Excel,un fichier Word, tout ce que vous voulez.Et puis, ce process de multiprocess,c'est quand même assez intéressant.
01:07:26 :Voilà.Est-ce que vous avez des questions?Ah, c'est cool.Si tu as bien aimé la génération de fausses données.En fait, c'est pour ça.Des fois, je me dis,je vais préparer les fausses donnéesavant de faire l'exercice,mais je trouve que des fois,c'est parfois un bon exercice
01:07:51 :de générer les datas.Ça permet de voir des choses,des boucles imbriquées un petit peu.Voilà, on a eu l'idée,le random choice, le faker et tout ça.
01:08:02 :Donc, c'est parfois intéressant.Pandas a servi à quoi?En fait, au début, je pensais...En fait, je l'ai juste utilisé un momentpour afficher...Tu vois, ça, c'est un data frameet j'ai créé ce tableau facilementjuste avec cette commande-làà partir d'une liste.
01:08:22 :Je trouve que c'est assez puissant quand mêmeparce que, t'imagines,t'as une liste de dictionnaireset tu peux faire ça.Non, pour lire le fichier TXT,j'ai juste utilisé Open.
01:08:34 :Je n'ai pas utilisé Pandas.J'aurais pu.En fait, au début, j'avais l'idée.Je me dis, vas-y,on va générer un fichier Excelavec plusieurs feuilles, etc.
01:08:43 :Mais bon, ça ne servait pas à grand-chosepour l'exercice qu'on fera la prochaine fois,si vous voulez.Mais là, pour l'exercice qu'on a fait,ça ne servait pas à grand-chose.
01:08:55 :Bon, je ne sais pas si vous avez des questions.Ouais, Pandas pour fichier Excel,c'est vraiment très, très recommandé.Je n'avais pas lu le pseudoMathieu Papagrougnon.
01:09:19 :C'est marrant.Bon, ben, pas de souci.Je reste juste une ou deux minutessi jamais vous avez des questions.Sinon, on peut s'arrêter là.En tout cas, c'était une belle découverte,le threading.
01:09:44 :C'était cool.Ouais, ben, merci.Et puis moi, c'est ce que je conseille d'utiliserplutôt que le multiprocessing.J'avoue que le multiprocessing,c'est plus difficile à appréhender encore.
01:09:52 :Parce que là, il faut vraiment gérerla concurrence entre les process et tout.Le multithreading, ça me suffit.Mais ça, c'est vraiment quand tu as des énormes boucles.
01:10:03 :Moi, je ne sais pas.Avec mes projets actuels, ça ne sert à rien pour l'instant.Le threading ?Le multithreading ?Ouais.Parce que typiquement, tu vois,la boucle qu'on a faite au début,j'ai volontairement mis un time.sleep.
01:10:14 :Mais sinon, ça va très vite.Tu vois, des fois,tu n'as pas besoin de mettre en place ça.C'est noté, Yanis.Je verrai ce que je peux faire.
01:10:26 :Mais c'est vrai que, voilà,moi, je m'en sers dans le cadre des simulations numériquesoù les simulations, elles peuvent prendre du temps.Mais c'est vrai que quand tu génères des fichiersou des trucs comme ça,Python, c'est déjà assez puissant en lui-même.
01:10:36 :Tu n'as parfois pas besoin.Mais il faut y penser.Des fois, tu as des trucs qui prennent du temps.Rien que des...Par exemple, un envoi d'e-mail,je pense que déjà, ça peut prendre du temps.
01:10:45 :Même si tu fais du scrapping du URL,tu sais, des fois, ça prend du temps.Merci à tous.Et bonne soirée aussi à tous.Je vais fermer la session, là,s'il n'y a pas d'autres questions.
01:11:01 :Bonne soirée, merci.C'était assez cool.Ça a été avec ta fille, au final ?Oui, mais j'ai suivi, on va dire,Andy Porto.C'est pour ça que je reprenais le filet du coup, je n'ai pas...
Aucune occurrence trouvée pour « ».
00:51:45
Threading
Bravo, tu es prêt à passer à la suite