TP programmation

Introduction

Ce TP vous présente quelques outils utiles pour commencer le projet de programmation.

Suppositions:

Sinon, voici quelques rappels de la syntaxe:

N'hésitez pas à poser des questions durant le TP.

Liens utiles pour aujourd'hui

Le langage python

Dans Python, tout est vu comme étant des listes ou des dictionnaires.

def f(*args):
    print args

f(1, 4, "x", True)

Déboggage avec pdb

$ python -i fichier.py  # ou ipython fichier.py
...
Exception
>>> import pdb
>>> pdb.pm()
(pdb)

Un exemple de deboggage

def binary_search(element, lst, start=0, end=None):
    """ Une fonction qui renvoie l'indice d'un element dans un liste triee (ou `None` s'il est absent). """

    if end is None:
        end = len(lst)
    if start == end:
        return None
    middle = int((start + end) / 2)
    if lst[middle] == element:
        return middle
    elif lst[middle] < element:
        return binary_search(element, lst, start, middle)
    else:
        return binary_search(element, lst, middle, end)

Lancer dans l'interpréteur:

print binary_search(3, [0, 1, 3, 5])
print binary_search(3, [0, 1, 3, 5, 10])
print binary_search(3, [0, 1, 3, 5, 10, 11])
print binary_search(3, [0, 1, 3])

Au lancement de la troisième ligne, on devrait voir une erreur.

Quelques fonctions de pdb

Les commandes ont tous une forme courte correspondante (ex: r pour return, s pour step).

Déboggage d'une instruction

$ python -i fichier.py  # ou ipython fichier.py
...
>>> import pdb
>>> pdb.run("""fonction(arguments)""")
>>> # ou pdb.run_ctx("""fonction(arguments)""", globals(), locals())

Déboggage d'un script à partir du début

$ python -m pdb fichier.py
(pdb)

Vous êtes dans le déboggeur avant la première instruction.

Exercice

Tenter un des exercices maintenant

Analyse d'efficacité

$ ipython ex1.py
In [1]: %timeit binary_search(3, [0, 1, 3, 5, 10])
1000000 loops, best of 3: 516 ns per loop

profile et cProfile

Lancement avec run

>>> import profile
>>> profile.run
<function run at 0x7fea254ef848>
>>> profile.run("print binary_search(3, [0, 1, 3, 5])")
2
         5 function calls in 0.000 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 :0(len)
        1    0.000    0.000    0.000    0.000 :0(setprofile)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 ex1.py:1(binary_search)
        1    0.000    0.000    0.000    0.000 profile:0(print binary_search(3, [0, 1, 3, 5]))
        0    0.000             0.000          profile:0(profiler)

Lancement avec runcall

>>> import profile
>>> profiler = profile.Profile()
>>> profiler.runcall(binary_search, 3, [0, 1, 3, 5])
>>> profiler.print_stats()
>>> profiler.dump_stats("stats")

Pour la lecture des statisques enregistrées

>>> import pstats
>>> reader = pstats.Stats('stats')
>>> reader.print_stats()
>>> reader.strip_dirs().sort_stats(-1).print_stats()

Lancement de la ligne de commande

python -m cProfile ex1.py

Traçage

python -m trace -t fichier.py

Ceci vous donne une liste de toute les lignes par lequel le programme est passé, dans l'ordre.

Obtenir de l'information

Obtenir la liste complète de fonctions et variables.

Obtenir les noms de variables existents

Exercice

Tenter un des exercices plus difficiles maintenant