DUT Informatique 1 – 2014/2015 Programmation Python Travaux Dirigés n o8 Listes, chaînes, dictionnaires : performances La documentation en ligne de Python 3 se trouve ici : http://docs.python.org/3/. Consultez-la régulièrement si vous avez des doutes sur une fonction ou une fonctionnalité. Dans tout le TP, chaque fonction que vous écrivez doit posséder une docstring qui indique ce qu’elle fait en fonction des paramètres donnés ! Au menu : l’objectif de ce TP est de comparer les performances de plusieurs méthodes utilisant des structures de données différentes (liste, chaînes, dictionnaire). x Exercice 1. histogramme Dans l’Exercice 3 du TP06, on a vu ce qu’était l’histogramme d’un texte : on construisait celui-ci sous la forme d’une liste mixte formée par l’alternance [s0 ,o0 ,s1 ,o1 ,...,sk ,ok ] où les si sont les symboles (lettres) présents dans la source (texte) et les oi sont leurs nombres d’occurrences (apparitions).(Q.2,3,4) Cette représentation n’était ni pratique ni performante. Nous allons en voir d’autres. 1 Par liste de paires (listes) : L’histogramme sera représenté par une liste HL de longueur N (nombre de symboles présents dans le texte) de paires [si ,oi ]. Ainsi un élément HL[i] de l’histogramme sera directement une liste à 2 éléments : [symbole,occurrences]. a Ecrire une fonction histoListApp(text) qui construit et renvoie, pour la source text, l’histogramme HLA des symboles rangés dans l’ordre d’apparition. b Ecrire une fonction histoListLex(text) qui renvoie l’histogramme HLL des symboles rangés dans l’ordre alphabétique. 2 Par dictionnaire : L’histogramme sera représenté par un dictionnaire HD de taille N dont les clefs sont les symboles (lettres) et les valeurs sont les occurrences correspondantes. Pour un symbole s, on obtient directement son occurrence avec H[s] a Ecrire une fonction histoDico(text) qui construit et renvoie, pour la source text, l’histogramme HD (dictionnaire). b Vous remarquerez qu’un dictionnaire n’est pas une structure ordonnée (1) . Pour trier un dictionnaire il faut le convertir en listes d’items (2) et trier ces listes : HDL = sorted(list(HD.items())). La structure de l’objet HDL ainsi construit est exactement la même que celle de l’histogramme lexicographique par listes HLL précédent. 3 Tests de performances : On veut maintenant comparer les vitesses d’excution de ces méthodes pour construire un histogramme lexicographique. Pour que les tests soient révélateurs, il faut travailler sur des sources volumineuses. a Récupérez les textes disponibles dans le répertoire http://igm.univ-mlv.fr/~incerti/1415/DUT1/data/ (1). ATTENTION ! : selon les versions de python, les éléments du dictionnaire peuvent être rangés dans l’ordre d’appartition ou dans un ordre apparemment aléatoire. Ne JAMAIS faire d’hypothèse sur l’ordre d’un dictionnaire ! (2). cf. documentation 1 b Pour charger les N premiers caractères d’un fichier texte dans une chaîne, on peut utilser : text=open(<PATH>,"r").read(N) où <PATH> est le chemin pour accéder au fichier (par exemple : "../data/alice.txt"). c Comparez, pour des sources de plus en plus volumineuses, les temps de calcul pour : i. l’utilisation de HLL=histoListLex(text), ii. l’utilisation de HLA=histoListApp(text) suivie d’un tri sur HLA, iii. l’utilisation de HD=histoDico(text) suivie d’un tri sur le dictionnaire HD (création de la liste HDL) Vous détaillerez les temps de calculs intermédiares pour les tests (ii) et (iii). Quelles conclusions en tirez-vous (expliquer les écarts de performance observés) ? x Exercice 2. matrice des permutations Une permutation d’ordre k sur un texte de longueur N consiste à "pousser" le texte vers la droite de k positions, récupérer les symboles qui "sortent" et les réinsérer en tête de texte. Par exemple la permutation d’ordre 6 sur la chaîne "petit papy poney " donne la chaîne "poney petit papy" 1 Dans cet exercice nous souhaitons construire ces permutations sous la forme de listes. La matrices des permutations d’un texte de longueur N est donc simplement une matrice carrée NxN dont chaque ligne L[i] est la permutation d’ordre i du texte (sous forme de liste). Pour la chaîne "poney", on obtiendrait perm=[[’p’,’o’,’n’,’e’,’y’],[’y’,’p’,’o’,’n’,’e’],[’e’,’y’,’p’,’o’,’n’],[’n’,’e’,’y’,’p’,’o’],[’o’,’n’,’e’,’y’,’p’]] Là encore on veut comparer les performances de plusieurs méthodes. Ecrivez, commentez (i.e. expliquez) et testez les performances des 4 méthodes proposées ci-dessous sur des entrées volumineuses (3) . a def permutations1(text) : c def permutations3(text) : perm = [] for i in range(len(text)) : perm = [list() for i in range(len(text))] perm.append([]) for i in range(len(text)) : for j in range(len(text)) : perm[i][0:0]=list(text[-i:]) perm[i].append(text[(i+j)%l]) perm[i][i:i]=list(text[:-i]) return perm return perm #---------------------------------#--------------------------------- b def permutations2(text) : d def permutations4(text) : perm = [list() for i in range(len(text))] perm = [list() for i in range(len(text))] p=perm[0]=list(text) for i in range(len(text)) : for i in range(1,len(text)) : perm[i]=list(text[-i:]+text[:-i]) perm[i]=p[-i:]+p[:-i] return perm return perm 2 Supposons maintenant que l’on puisse se contenter de disposer des permutations directement sous la forme de chaînes de caractères. On peut alors construire notre "matrice de permutations" sous la forme d’une simple liste de chaînes. Ecrivez une fonction (la plus performante possible) permutations5(text) qui produit en sortie la liste de toutes les permutations sous forme de chaînes. Pour la chaîne "poney", on obtiendrait cette fois perm=["poney","ypone","eypon","neypo","oneyp"] Comparez l’efficacité de cette méthode par rapport aux 4 précédentes. (3). Attention : si la taille du texte est trop importante (>50 000 car.), cela peut saturer la mémoire et produire une erreur 2
© Copyright 2024 ExpyDoc