2009-12-08 16 views
1

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 

Répondre

3

Ma réponse est une approche différente du problème tout à fait: Essayez d'utiliser un système de contrôle de version comme git pour enquêter sur la façon dont le répertoire a changé au fil des ans.

Faites un référentiel hors du premier répertoire, puis remplacez le contenu par le répertoire de l'année suivante et validez-le en tant que changement. (ou déplacez le répertoire .git dans le répertoire de l'année suivante, pour économiser sur la copie/suppression). répéter.

Ensuite, exécutez gitk, et vous serez en mesure de voir ce qui a changé entre deux révisions de l'arbre. Soit juste un fichier binaire changé, soit avec un diff pour les fichiers texte.

+0

Pourquoi ne pas simplement GNU diff à la place? – ChristopheD

+0

@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

+0

@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