|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||
|
Nouveau Membre du Club
![]() Mon boulot ?? En ce moment, j'me l'demande... Inscription : novembre 2004 Messages : 90 ![]() |
Bonjour,
Je me suis auto formé à Python mais pas encore vraiment à la programmation objet. J'ai développé un programme sans vraiment exploiter la programmation objet. Entre autre, j'ai usé et abusé des listes dans ce programme. En abordant la programmation objet, je me suis dit que de nombreux attributs dans mon programme pouvaient être regroupé dans ces fameux objets. Par contre, je me demandais si "ça valait le coup" que je fasse ce gros lifting. Pour essayer de répondre à ma question, j'ai fait un petit test de performance suivant : - 1 - Pour simuler la méthode de mon programme actuel, j'ai fait une boucle qui allouait 100 000 000 de fois (oui, c'est beaucoup) une valeur à un élément de liste. - 2 - J'ai fait la même boucle mais cette fois-ci, je suis passé par un objet et je modifie "directement" une des propriété de cet objet (mais parait que c'est philosophiquement pas bien pour la Programmation objet d'après ce que j'ai lu) - 3 - Encore la même boucle mais en passant par une méthode pour modifier une des propriété de l'objet (parait que c'est mieux...). J'ai obtenu les résultats suivants (les valeurs sont en secondes) : Citation:
Merci à vous. PS : Voici le code utilisé pour mon test Code :
|
|||
|
|
00
|
|
|
#2 | ||||
|
Membre du Club
![]() Serge Inscription : février 2012 Messages : 28 ![]() |
J'ai modifié ton code pour faciliter les benchs, mais le fond reste le même.
J'ai aussi modifié le nombre de tour de boucle, parce que je suis sur un netbook qui est très lent. Code :
Code :
Prendre un index dans une liste, c'est assez long. Idem pour reconstruire la chaîne à chaque tour de boucle (c'est assez visible dans la partie 1). Mieux vaut aller prendre la référence de l'index de la liste avant d'entamer la boucle. Un des goulets d'étranglement dans ton code est aussi l'utilisation de while. Mieux vaut utiliser for (pour les générateurs), et tu y gagnes en plus en lisibilité. La partie 3 restera toujours plus lent que les autres, car les appels de fonctions sont assez gourmand. Une solution peut-être de faire un lien vers cette fonction, ce qui évite de faire appel à "l'accesseur" (me semble que c'est le nom) de la méthode au sein de l'instance. Maintenant, ça reste du benchmark pour du benchmark, et je pense que ton code ne doit pas être suffisamment bien construit de base pour éviter au maximum les appels qui réduisent les performances. En tout cas, dans ce code, je ne vois pas l’intérêt de parcourir une liste. Edit: J'avais oublié l'essentiel. Le fait d'appeler directement la variable d'instance n'est pas "sale philosophiquement parlant". Bien au contraire. Dans d'autres langages, faut que tu passes par ces procédures, que je juge lourdingue dans des cas simple d'assignation comme présenté ici. En python, tu peux t'en passer, et le code en sera d'autant plus lisible (modulo le fait que tu nommes tes variables correctement pour qu'on puisse comprendre à leurs intitulés leurs fonctions). Souvent, on passe par ces accesseurs pour éviter de trifouiller aux variables privés d'instance et foutre le dawa. En python, on est entre adulte responsable, et on précède le nom de sa variable par un underscore pour dire "c'est privé, tu n'y touches pas de l'extérieur" sans avoir besoin de mettre une mécanique chiante à écrire. Et puis, si en Python, on ne pouvait pas faire appel directement aux variables d'instances, de classes, etc... on pourrait mettre à la poubelle les indispensables property, ce qui serait franchement moche. Et "philosophiquement" parlant, appeler myinstance.myvar ou myinstance.set_myvar, c'est exactement la même chose en python : appeler des références vers des objets. Par conséquent, interdire d'appeler des variables reviendraient à interdire de faire appel à des fonctions, puisque c'est la même chose. Et tu en conviendras, ce serait un peu difficile pour construire un programme de cette manière. |
||||
|
|
10
|
|
|
#3 | |||||||||
|
Nouveau Membre du Club
![]() Mon boulot ?? En ce moment, j'me l'demande... Inscription : novembre 2004 Messages : 90 ![]() |
Tout d'abord merci pour ta contribution.
Ces tests complémentaires sont fort intéressants. Citation:
Code :
Là où je gagne sur la partie 3, c'est effectivement en ajoutant un "lien" vers la fonction.. Code :
Citation:
En fait, je me posais cette question car dans le programme un peu plus étoffé que j'ai développé jusqu'à présent, en conservant cet exemple, je passe d'un objet "humain" à l'autre pour en modifier éventuellement les attributs.. mais pour ne pas modifier directement ceux-ci, je récupérais chaque attributs en début de programme, je les insérais dans des listes et je travaillais directement sur ces listes. Je ne sais pas si c'est très clair mais en gros, par exemple, j'avais tous les objets "humains" en début de programme avec des attributs "age", "statut", etc.. En début de programme, je récupérais chaque attribut que je mettais dans une liste adéquat (listAge, listStatut) et après je travaillais sur la liste via l'indice commun de chacun (listAge[0], listStatut[0] --> Attribut de mon premier "Humain", listAge[1], listStatut[1] --> Attribut de mon deuxième"Humain", etc...). Donc quand je modifiais un attribut, je modifiais en fait la liste et pas l'objet. Citation:
Et donc finalement, par rapport à mon exemple ci-dessus, je pourrais modifier directement les attributs de mes "Humains" sans m'embêter à mettre tout ça dans des listes ? Hormis que je perdrais très légèrement en performance d'après les tests que je viens de faire.. NB : Mon code "crado" modifié avec ces optimisations. Code :
|
|||||||||
|
|
00
|
|
|
#4 | |||||
|
Expert Confirmé Sénior
![]() ![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 533 ![]() |
Citation:
Tu peux tout à fait modifier tes attributs de façon directe même dans d'autres langages comme C++ à condition que ces attributs soient publics. Le danger de cette façon de faire arrive quand on travaille sur des gros projets à plusieurs et que tu n'es alors pas maitre du code de tes collègues qui peuvent eux aussi modifier tes attributs directement. Le cas arrive aussi quand la modif se fait à partir d'une valeur saisie par un utilisateur extérieur. Alors que si tu crées un point d'entrée unique pour modifier tes attributs, tu peux alors contrôler la façon dont ils sont modifiés. Accessoirement, tu peux rendre des attributs privés en Python en les faisant précéder de __ Code python :
Code python :
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
|||||
|
|
10
|
|
|
#5 |
|
Nouveau Membre du Club
![]() Mon boulot ?? En ce moment, j'me l'demande... Inscription : novembre 2004 Messages : 90 ![]() |
Merci à vous deux pour vos lumières.
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com