IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

optimiser un code python


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Par défaut optimiser un code python
    Bonjour ,

    comment je peux diminuer le temps d’exécution de ce programme sachant que le tableau tab_voyelle contient 2669433 éléments:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     
    for elem in tab_voyelle:
    	print 'la longueur est : ==>'
    	print len(tab_voyelle)
    	words_match = []
    	elem = elem.strip()
    	test = 0
    	Tab_elem_out = CheckImpli(elem,tab_voyelle)
    	if len(Tab_elem_out) != 0:
    		MonFichINImpli = open('in_imply_result.txt','w')
    		for i in range(len(Tab_elem_out)):
    			MonFichINImpli.write(elem + '	' + Tab_elem_out[i] + '\n')
    		MonFichINImpli.close()
    		subprocess.call(['java', '-jar', 'ImpliMorphVer4.jar','-i', 'in_imply_result.txt','-o','Result_Impli.txt'])
    		words_match = MatchingArabicWords('Result_Impli.txt','in_imply_result.txt')
    	if len(words_match) != 0 :
    		MonFichierResultat.write('<mot id="'+elem+'">'+'\n')
    		for valeur in words_match:
    			valeur = valeur.strip()
    			MonFichierResultat.write('<val>'+valeur+'</val>'+'\n')
    			t = tab_voyelle[tab_voyelle.index(valeur)]
    			print t.decode('utf-8')
    			del tab_voyelle[tab_voyelle.index(valeur)]
    		MonFichierResultat.write('</mot>' + '\n')
     
    	if len(words_match) == 0:
    		MonFichierResultat.write('<mot id="'+elem+'">'+'\n'+'<val></val>\n'+'</mot>' + '\n')
    MonFichierResultat.write('</matching>' + '\n')
    MonFichierResultat.close()

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    C'est pas compliqué si vous avez un grand nombre d'itérations, il faut commencer par réduire la durée de chaque itération, et paralléliser. Et pour réduire la durée de chaque itération, il faut regarder le temps que prend chaque opération élémentaire et regarder comment s'en passer.
    Par exemple, vous avez dans votre code la création et l'écriture d'un fichier.
    Vous pouvez regarder combien de temps prend:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import time
    start = time.time()
    for _ in range(10000):
        with open('test.txt', 'w') as f:
            pass
    print(time.time() - start)
    Chez moi, c'est 14 s. multiplié par 300 histoire d'avoir une idée de combien de temps çà prendrait pour 2669433 itération on arrive déjà à 4200 secondes i.e. plus d'une heure.
    Ajoutez le temps passé dans subprocess.call, çà fait déjà des plombes.

    Donc déjà la question serait de réduire le nombre d'appels au process java externe en lui passant plus d'informations à traiter à la fois (si c'est possible). Mais de fait, si vous ne pouvez rien changer du côté de cette interface, c'est pas côté Python que vous allez pouvoir faire grand chose (à part éventuellement paralléliser mais vous n'obtiendrez pas plus qu'un facteur lié au nombre de CPU disponibles i.e. 5 à 10 fois plus vite pour autant que les disques suivent).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Sans compter le fait que certaines fonctions dont on ne connaît pas les tenants et les aboutissants se rajoutent à ce temps.

    Il faudra donc fonction par fonction, vérifier le temps d'exécution en utilisant la méthode de wiztricks...

    Ce qui est sûr c'est qu'il y a forcément une meilleure manière que de faire n fois des ouvertures, écritures et fermetures de fichiers. Je suis pas sûr mais si certaines autres fonctions refont ce même travail, c'est une catastrophe algorithmiquement parlant. Dans ce cas, c'est tout le concept qui est à revoir !

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Par défaut
    il y a cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    def MatchingArabicWords(result_impl, in_impl):
    	num_line = 0
    	exact_match = 0
    	tab_correct_line = []
    	tab_result_impl = []
    	tab_words_implication = []
    	fh_impl = open(result_impl,"r")
    	tab_in_impl = []
    	for ligne in fh_impl:
    		tab_result_impl.append(ligne)
    	fh_impl.close()
    	for i in range(len(tab_result_impl)):
    		tab = tab_result_impl[i].split('	')
    		tab_result = []
    		for var in tab:
    			if(var != ''):
    				tab_result.append(var)
    		#for j in range(len(tab_result)):
    		if(tab_result[0] == "Correct" and tab_result[1] == "Sure"):	
    			num_line = i + 1
    			tab_correct_line.append(num_line)
    			with open(in_impl,'r') as fich:
    				for k in range(num_line):
    					ligne = fich.readline()
    			tab_words_implication.append(ligne)
     
     
    	#on va extraire les mots qui correspondent
    	tab_found_words = []
    	if(len(tab_words_implication)!=0):
    		for word in tab_words_implication:
    			tab_words = word.split('	')
    			tab_found_words.append(tab_words[1])
    	return tab_found_words

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Sans compter le fait que certaines fonctions dont on ne connaît pas les tenants et les aboutissants se rajoutent à ce temps.

    Il faudra donc fonction par fonction, vérifier le temps d'exécution en utilisant la méthode de wiztricks...

    Ce qui est sûr c'est qu'il y a forcément une meilleure manière que de faire n fois des ouvertures, écritures et fermetures de fichiers. Je suis pas sûr mais si certaines autres fonctions refont ce même travail, c'est une catastrophe algorithmiquement parlant. Dans ce cas, c'est tout le concept qui est à revoir !

    comment parce que oui ds la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    def MatchingArabicWords(result_impl, in_impl):
    	num_line = 0
    	exact_match = 0
    	tab_correct_line = []
    	tab_result_impl = []
    	tab_words_implication = []
    	fh_impl = open(result_impl,"r")
    	tab_in_impl = []
    	for ligne in fh_impl:
    		tab_result_impl.append(ligne)
    	fh_impl.close()
    	for i in range(len(tab_result_impl)):
    		tab = tab_result_impl[i].split('	')
    		tab_result = []
    		for var in tab:
    			if(var != ''):
    				tab_result.append(var)
    		#for j in range(len(tab_result)):
    		if(tab_result[0] == "Correct" and tab_result[1] == "Sure"):	
    			num_line = i + 1
    			tab_correct_line.append(num_line)
    			with open(in_impl,'r') as fich:
    				for k in range(num_line):
    					ligne = fich.readline()
    			tab_words_implication.append(ligne)
     
     
    	#on va extraire les mots qui correspondent
    	tab_found_words = []
    	if(len(tab_words_implication)!=0):
    		for word in tab_words_implication:
    			tab_words = word.split('	')
    			tab_found_words.append(tab_words[1])
    	return tab_found_words
    il y a n fois ouverture du coup une catastrophe algorithmique

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    comment parce que oui ds la fonction
    Travailler seulement avec les chaînes de caractères ? Après, on a pas l'objectif, les contraintes et l'énoncé du problème, on peut difficilement proposer une solution...

    il y a n fois ouverture du coup une catastrophe algorithmique
    Il ne faut donc pas s'étonner, c'est un gouffre niveau temps si l'on considère les temps annoncés par wiztricks.

    À quoi sert le programmeImpliMorphVer4.jar ? Ne peut-il pas représenter une fonction dans un code python ?

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par rimenis Voir le message
    Il y a n fois ouverture du coup une catastrophe algorithmique
    Ce n'est pas une "catastrophe algorithmique": la complexité reste en O(N).
    Par contre vous vous rendez compte qu'un code qui fonctionne de façon satisfaisante avec un petit nombre d'itérations devient difficilement utilisable lorsque ce nombre devient important.
    Pour faire une analogie, trier par age ou par taille une classe de 30 élèves peut se faire avec sort sur une liste de listes. Essayer de généraliser cela à l'ensemble des habitants d'un département, d'une région, d'un pays,... sera irréaliste.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Ce n'est pas une "catastrophe algorithmique": la complexité reste en O(N).
    Pas sûr ! Sur cette fonction oui, sur l'ensemble du code, c'est une énième boucle for... Non ?

  9. #9
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    • que fait CheckImpli() et à quoi sert ImpliMorphVer4.jar ?
    • quel genre de données contient tab_voyelle ?
    • est-il envisageable de recoder ImpliMorphVer4.jar en Python ?
    • in fine, quel est le but de ce programme Python ?


    comme dit plus haut, rien que le fait d'ouvrir/fermer des fichiers en permanence plombe les performances (I/O disque), alors que si on regarde bien les fichiers ne servent qu'à faire transiter l'information entre le programme Python et ImpliMorphVer4 (ou l'inverse)

Discussions similaires

  1. Réponses: 0
    Dernier message: 26/08/2016, 19h20
  2. Réponses: 0
    Dernier message: 24/08/2014, 13h04
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo