J'utilise difflib pour comparer des fichiers dans deux répertoires (versions d'années consécutives). Tout d'abord, j'utilise le fichier filecmp pour trouver les fichiers qui ont changé, puis itérativement en utilisant difflib.SequenceMatcher pour les comparer et générer un diff html comme expliqué here.Surcharge Python SequenceMatcher - Utilisation 100% CPU et traitement très lent
Cependant, je trouve que le programme prend trop de temps à s'exécuter et python utilise 100% CPU. Sur le profilage temporel, j'ai trouvé que l'appel seqm.get_opcodes() qui prend tout le temps.
Tout aperçu serait apprécié. Merci!
code:
#changed_set contains the files to be compared
for i in changed_set:
oldLines = open(old_dir +"/" + i).read()
newLines = open(new_dir +"/" + i).read()
seqm = difflib.SequenceMatcher(lambda(x): x in string.whitespace, oldLines, newLines)
opcodes = seqm.get_opcodes() #XXX: Lots of time spent in this !
produceDiffs(seqm, opcodes)
del seqm
Pourquoi ne pas simplement GNU diff à la place? – ChristopheD
@ChristopheD, Git utilise diff pour afficher les différences. Cependant, cela fait beaucoup pour vous: il détermine quels fichiers n'ont pas changé, et donne un diff sur seulement ceux qui ont changé. Ensuite, gitk enveloppe tout cela dans une interface graphique conviviale où vous pouvez facilement parcourir les différentes révisions. Cette réponse a du sens pour moi. – steveha
@PeterCordes: C'est la bonne solution - utiliser les métadonnées de GIT pour obtenir des informations sur l'emplacement du changement. Cependant, cela ne m'aidera pas car actuellement toutes les données des années précédentes sont sauvegardées dans un système de fichiers et je n'ai pas directement accès au CVS. @ChristopheD: En fait, j'utilisais la commande diff avant d'un script shell mais ensuite vous obtenez seulement des détails au niveau de la ligne (ajouter/supprimer). Avec python difflib, vous obtenez des informations précises sur les caractères qui ont été insérés, supprimés, remplacés par une API. Donc, je suis passé à Python difflib. – shauvik