17.12.2012 Views

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

450<br />

Techniques avancées<br />

QUATRIÈME PARTIE<br />

Caching<br />

Lorsqu’une fonction très coûteuse en temps est appelée plusieurs fois, il peut être<br />

intéressant de mettre en place un système de cache, qui conserve les résultats des calculs<br />

en mémoire et les ressert en cas de besoin, afin d’éviter de les recalculer.<br />

Cette technique n’est bien sûr applicable qu’aux fonctions dont les résultats restent<br />

invariants en fonction des paramètres d’entrée.<br />

Le module dircache est un bon exemple de caching : pour fournir une liste des<br />

fichiers d’un répertoire donné, le parcours est relativement coûteux, surtout si toute<br />

l’arborescence est demandée.<br />

Le contenu de chaque répertoire parcouru est conservé en mémoire dans un dictionnaire,<br />

et resservi à condition que la date de modification du répertoire au moment de<br />

la demande soit identique à celle conservée en mémoire. Dans le cas inverse, le cache<br />

est mis à jour.<br />

Module dircache<br />

cache = {}<br />

def reset():<br />

"""Reset the cache completely."""<br />

global cache<br />

cache = {}<br />

def listdir(path):<br />

"""List directory contents, using cache."""<br />

try:<br />

cached_mtime, list = cache[path]<br />

del cache[path]<br />

except KeyError:<br />

cached_mtime, list = -1, []<br />

mtime = os.stat(path).st_mtime<br />

if mtime != cached_mtime:<br />

list = os.listdir(path)<br />

list.sort()<br />

cache[path] = mtime, list<br />

return list<br />

Si l’on généralise ce mécanisme, appelé aussi memorizing, on obtient le code pattern<br />

suivant, qui collecte les résultats calculés, en fonction des paramètres, en fabriquant<br />

une clé unique pour chaque combinaison.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!