Programmation Objet "lente" ?
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:
1 - Temps pour l'action de modifier une valeur : 28
2 - Temps pour l'action de modifier un objet (directement) : 33
3 - Temps pour l'action de modifier un objet (par méthode) : 60
Appuyez sur une touche pour continuer...
Donc, c'est surement par ignorance que je pose cette question probablement caricaturale, mais je voulais avoir vos avis d'experts Python à ce sujet : En Python, la Programmation Objet est-elle, dans un certain sens, plus lente que la programmation "non objet" (euh... procédurale ?) ?
Merci à vous.
PS : Voici le code utilisé pour mon test
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| import random
import os
import time
tsDeb = round(time.time()) # Timestamp actuel
# Déclaration des variables et objets
numero = 1
nbtest = 100000000
statut = [0]
HUMAIN = [0]
class Humain: # Definition de la classe Humain
def __init__(self, id, nom, statut): # Constructeur de Humain
self.id = id
self.nom = nom
self.statut = statut
HUMAIN[0] = Humain(1, "TOTO", 100)
while numero<nbtest:
statut[0] = 99
numero +=1
tsFin = round(time.time()) # Timestamp actuel
tpsTs = tsFin - tsDeb
print("1 - Temps pour l'action de modifier une valeur : {0}".format(tpsTs))
#########################################################################
tsDeb = round(time.time()) # Timestamp actuel
# Déclaration des variables et objets
numero = 1
nbtest = 100000000
statut = [0]
HUMAIN = [0]
class Humain: # Definition de la classe Humain
def __init__(self, id, nom, statut): # Constructeur de Humain
self.id = id
self.nom = nom
self.statut = statut
HUMAIN[0] = Humain(1, "TOTO", 100)
while numero<nbtest:
HUMAIN[0].statut = 99
numero +=1
tsFin = round(time.time()) # Timestamp actuel
tpsTs = tsFin - tsDeb
print("2 - Temps pour l'action de modifier un objet (directement) : {0}".format(tpsTs))
######################################################################
tsDeb = round(time.time()) # Timestamp actuel
# Déclaration des variables et objets
numero = 1
nbtest = 100000000
statut = [0]
HUMAIN = [0]
class Humain: # Definition de la classe Humain
def __init__(self, id, nom, statut): # Constructeur de Humain
self.id = id
self.nom = nom
self.statut = statut
def modifStatut(self, newStatut): # Permet de modifier le statut de Humain
self.statut = newStatut
HUMAIN[0] = Humain(1, "TOTO", 100)
while numero<nbtest:
HUMAIN[0].modifStatut(99)
numero +=1
tsFin = round(time.time()) # Timestamp actuel
tpsTs = tsFin - tsDeb
print("3 - Temps pour l'action de modifier un objet (par méthode) : {0}".format(tpsTs))
os.system("pause") |