Une rapide introduction
CentraleSupélec
Module SPM-INF-002:
Evaluation par le rendus du TP5, limite 1 semaine après le TP : code sur https://gitlab-student.centralesupelec.fr + Rapport avec illustrations du travail.
Scientific python lectures aborde :
L’écosystème python est très riche en librairies scientifiques :
Python est un langage interprété
“à la volée”: cpython peut créer un fichier .pyc qui contient le code compilé (bytecode).
Les interpréteurs
Mauvais code
range explicité en mémoire \(\neq\) paresseusefor en pythonl[i] pourrait être problématique mais les listes python sont des tableaux et pas des listes chaînéesMauvais code
Fondamentalement différent
built-in sum, déjà compiléeAttention donc au “c’est le même code”, “mais ça marche”.
Instructions vectorielles
CPython ne supporte pas les instructions vectorisées,gcc ou clang, réorganisent le code pour exploiter les instructions SIMDUn environnement virtuel est :
Il permet la reproductibilité (Benureau and Rougier 2018), avec le contrôle des packages installés et de leurs versions.
Différentes options :
venv (inclus dans Python depuis la version 3.3) : python package manager, ne permet pas de changer de version de pythonanaconda, miniconda, mamba, micromamba, etc… : system package manager. Permet de changer de version de python, installer des dépendances autres que des packages python (e.g. C++, Java, Rust, …), mais parfois un peu lourduv https://docs.astral.sh/uv : python package manager, flexible sur la version de python, ne permet d’installer que des paquets pythonPour installer micromamba (en utilisateur normal):
Pour construire un environnement virtual local dédié :
Pour installer des dépendances :
On peut exporter, recharger, etc.. un environnement.
Pour installer uv (en utilisateur normal) :
Pour construire un environnement virtuel local dédié :
Pour installer des dépendances :
Warning
Vous devez utiliser un Integrated Development Environment (IDE)
Suggestion : utilisez Visual Studio Code + tout son environnement de plugins qui permet :
VS Code https://code.visualstudio.com/docs/languages/python
=> Démo avec Venv
On peut également travailler avec des notebooks jupyter.
Fonctionnalités :
Voir ces exemples à essayer dans le navigateur, e.g. le simulateur de l’attracteur de Lorentz
Attention à l’ordre d’exécution des cellules.
=> Démo avec venv pour l’installer localement
int, float, bool, setstr, tuplelistdicttype(x), tester le type isinstance(x, letype), connaître les méthodes applicables dir(x)x = 3, walrusSur les listes
Faire attention aux constructions du type :
Complexité en temps en \(O(|L|^2)\) pour une liste chaînée. Complexité en temps en \(O(|L|)\) pour un tableau.
Les générateurs
Une construction de liste par compréhension est exécutée à la déclaration.
Pour économiser de la mémoire (e.g. permettant de représenter d’énormes structures), on peut utiliser des générateurs
Sur les fonctions
Définition d’une fonction : def fname():
On peut utiliser un nombre variable d’arguments positionnels *args et/ou nommés **kwargs (kwargs = keyword arguments). Voir Python args and kwargs.
Les lambda fonctions allègent la déclaration des fonctions :
Voir https://www.pythoncheatsheet.org/cheatsheet/decorators
@CountCallNumber
def say_hi(name"):
print("Hi ! My Name is "+ name)
class CountCallNumber:
def __init__(self, func):
self.func = func
self.call_number = 0
def __call__(self, *args, **kwargs):
self.call_number += 1
print("This is execution number " + str(self.call_number))
return self.func(*args, **kwargs)Loguer avec print: Pour déboguer un programme, on utilise bien souvent des print(...)
Que l’on peut combiner avec des f-strings :
Que l’on peut combiner avec des options de formattage :
Loguer avec logging : On peut aussi utiliser des loggers du module logging :
import logging
logging.basicConfig(format="%(levelname)s - %(asctime)s: %(message)s",
datefmt= "%d/%m/%y %H:%M:%S", level=logging.INFO)
logging.info("Une info")
logging.warning("Un warning")
logging.error("Une erreur")
logging.basicConfig(filename="monlog.log",
format="%(levelname)s - %(asctime)s: %(message)s",
datefmt= "%d/%m/%y %H:%M:%S", level=logging.INFO)De manière générale sur un texte en ASCII :
Lecture, avec un with statement:
Ecriture :
Stocker des données numériques en ASCII
ATTENTION C’est une très mauvaise idée.
La valeur “1.23439949959” en ASCII occupe \(13 \times 8 = 104 bits\). Alors qu’un flottant peut occuper \(64\), \(32\), \(16\) bits.
Si ce sont des tableaux de valeurs, utilisez numpy.savez.
Sur des formats spécifiques yaml, xml, json, utilisez des parsers écrit pour le yaml, xml, json
Vous pouvez aussi construire votre propre format de fichier et utiliser fh.seek(), fh.read(num_bytes), struct.pack(), struct.unpack(). Voir struct
Ecrire un fichier en binaire

Produced with quarto