Histoire de Python¶
Python est ne en 1991 sous la plume de Guido van Rossum, chercheur au CWI (Centrum Wiskunde & Informatica) aux Pays-Bas. Conçu comme un successeur du langage ABC, Python s'est impose grâce à une philosophie claire : la lisibilite du code prime sur tout le reste. Aujourd'hui, Python est l'un des langages les plus utilisés au monde, dominant les domaines du web, de la data science et de l'intelligence artificielle.
Origines et philosophie¶
Guido van Rossum commence le développement de Python pendant les vacances de Noel 1989. Le nom est un hommage au groupe comique britannique Monty Python's Flying Circus, et non au serpent. Le langage est conçu autour de plusieurs principes fondateurs :
- Lisibilite : le code doit être facile à lire, même par des non-initiaux
- Batteries included : la bibliotheque standard couvre un maximum de besoins
- Pragmatisme : une seule façon evidente de faire les choses
- Communauté ouverte : gouvernance transparente via les PEP
Ces principes sont formalisés dans le Zen de Python (PEP 20), accessible directement depuis l'interpréteur :
import this
# The Zen of Python, by Tim Peters
# Beautiful is better than ugly.
# Explicit is better than implicit.
# Simple is better than complex.
# ...
Chronologie des versions majeures¶
| Version | Date | Événements clés |
|---|---|---|
| 0.9.0 | 1991 | Première version publique, types de base, exceptions, fonctions |
| 1.0 | 1994 | lambda, map, filter, reduce |
| 1.5 | 1997 | Améliorations OOP, modules re (regex) |
| 2.0 | 2000 | List comprehensions, garbage collector, Unicode basique |
| 2.2 | 2001 | Unification types/classes, generators, descripteurs |
| 2.4 | 2004 | Decorateurs, generator expressions |
| 2.5 | 2006 | with statement, expressions conditionnelles |
| 2.6 | 2008 | Transition vers Python 3, warnings de compatibilité |
| 2.7 | 2010 | Dernière version 2.x, fin de support en 2020 |
| 3.0 | 2008 | Rupture de compatibilité, print(), Unicode natif, int unifies |
| 3.3 | 2012 | yield from, venv intégré, namespace packages |
| 3.5 | 2015 | async/await, type hints (PEP 484), @ pour matrices |
| 3.6 | 2016 | f-strings, annotations variables, dict ordonné |
| 3.7 | 2018 | dataclasses, breakpoint(), dict garanti ordonné |
| 3.8 | 2019 | Walrus operator (:=), positional-only params, f-strings debug |
| 3.9 | 2020 | dict merge ( |
| 3.10 | 2021 | Pattern matching (match/case), ParamSpec, meilleurs messages |
| 3.11 | 2022 | +25% de performances, ExceptionGroup, tomllib intégré |
| 3.12 | 2023 | Type aliases, @override, f-strings ameliorees, perf GIL |
| 3.13 | 2024 | GIL optionnel (free-threaded), JIT experimental, REPL amélioré |
La transition Python 2 vers Python 3¶
La migration de Python 2 vers Python 3 est l'une des transitions les plus longues de l'histoire des langages modernes. Python 3.0 sort en 2008 avec des changements intentionnellement incompatibles :
printdevient une fonction :print("hello")- Division entière explicite :
5 // 2 == 2,5 / 2 == 2.5 unicodeetstrfusionnes,bytesdistinctrange()retourné un iterateur, plus une liste- Suppression des comparaisons implicites entre types incompatibles
# Python 2
print "hello"
print 5 / 2 # => 2
# Python 3
print("hello")
print(5 / 2) # => 2.5
print(5 // 2) # => 2
Fin de vie de Python 2
Python 2.7 a atteint sa fin de support officielle le 1er janvier 2020. Tout code encore en production sous Python 2 est non supporte et expose a des vulnérabilités non corrigees.
L'outil 2to3 permet d'automatiser une grande partie de la migration, mais une revue manuelle reste indispensable pour les cas complexes.
Le système PEP (Python Enhancement Proposal)¶
Les PEP sont le mécanisme officiel d'évolution du langage. Toute proposition de modification — syntaxe, bibliotheque standard, processus — passe par une PEP soumise à la communauté.
Types de PEP :
| Type | Description | Exemples |
|---|---|---|
| Standards | Modifications du langage ou de la bibliotheque | PEP 8, 484, 572 |
| Informational | Lignes directrices, conventions | PEP 20, 257 |
| Process | Gouvernance, processus de release | PEP 1, 101 |
PEP importantes a connaître :
- PEP 8 — Style guide officiel (indentation, nommage, longueur de ligne)
- PEP 20 — Zen de Python
- PEP 257 — Conventions pour les docstrings
- PEP 484 — Type hints
- PEP 572 — Walrus operator (
:=) - PEP 634 — Pattern matching structural (match/case)
- PEP 703 — GIL optionnel (Python 3.13)
Gouvernance du projet¶
Jusqu'en 2018, Guido van Rossum exercait le rôle de BDFL (Benevolent Dictator For Life). Suite au retrait de Guido après la controverse autour de la PEP 572, Python adopte un modèle de Steering Council (5 membres elus par la communauté des core developers).
Le cycle de release suit désormais un rythme annuel :
- Alpha : fonctionnalités en cours d'intégration
- Beta : gel des fonctionnalités, chasse aux bugs
- RC (Release Candidate) : derniers tests
- Final : release officielle en octobre
Chaque version mineure est supportee pendant 5 ans (bug fixes 2 ans, security fixes 5 ans).
Positionnement actuel¶
Python est aujourd'hui en tete des classements TIOBE, Stack Overflow et GitHub. Ses domaines de predilection :
| Domaine | Outils phares |
|---|---|
| Data Science | numpy, pandas, polars, matplotlib, seaborn |
| Machine Learning | scikit-learn, PyTorch, TensorFlow, JAX |
| Web backend | Django, FastAPI, Flask, Litestar |
| Scripting / ops | Ansible, Fabric, Click, Typer |
| Automatisation | Selenium, Playwright, Robot Framework |
| Finance / quant | QuantLib, zipline, backtrader |
Pourquoi Python domine la data science
La combinaison d'une syntaxe lisible, d'un écosystème de librairies scientifiques matures (numpy, scipy) et d'une adoption massive par la recherche academique a créé un effet réseau imbattable. La majorité des papiers de recherche en IA publient leur code en Python.
Interopérabilité et extensions C¶
Python est lent nativement pour les calculs intensifs. Plusieurs solutions existent pour combiner la facilite de Python avec la performance du C/C++ :
- CPython : implémentation de référence, permet d'écrire des extensions C
- Cython : compile Python en C, annotations de types statiques
- ctypes / cffi : appel direct de librairies C depuis Python
- PyPy : implémentation alternative avec JIT compiler (2-10x plus rapide)
- Mypyc : compile des modules types en C via mypy
# Exemple d'annotation Cython pour acceleration
# fichier: calcul.pyx
def somme_carres(int n) -> int:
cdef int i, total = 0
for i in range(n):
total += i * i
return total
La philosophie reste la même : écrire en Python pur d'abord, profiler, puis optimiser uniquement les goulots d'étranglement.
Le GIL — Global Interpréter Lock¶
Le GIL (Global Interpréter Lock) est un verrou interne a CPython qui empêche plusieurs threads d'exécuter du bytecode Python simultanément. C'est l'une des critiques les plus fréquentes adressees a Python pour les applications fortement parallelisees.
Impact pratique¶
| Cas d'usage | Impact du GIL | Solution recommandee |
|---|---|---|
| Traitement I/O (réseau, disk) | Faible | asyncio, threading |
| Calcul CPU intensif | Fort | multiprocessing, concurrent.futures |
| Numpy / extensions C | Nul (relache le GIL) | Utilisation directe |
| Serveurs web (uvicorn) | Géré par design | workers multiples (--workers N) |
# Parallelisme CPU avec multiprocessing
from concurrent.futures import ProcessPoolExecutor
from typing import Callable
def calculer_segment(debut: int, fin: int) -> int:
"""Calcule la somme d'un segment — s'execute dans un sous-processus."""
return sum(range(debut, fin))
def somme_parallele(total: int, nb_workers: int = 4) -> int:
"""Divise le calcul sur plusieurs processus pour contourner le GIL."""
taille = total // nb_workers
segments = [(i * taille, (i + 1) * taille) for i in range(nb_workers)]
with ProcessPoolExecutor(max_workers=nb_workers) as executor:
resultats = executor.map(lambda s: calculer_segment(*s), segments)
return sum(resultats)
# I/O concurrente avec asyncio (non bloque par le GIL)
import asyncio
import httpx
async def recuperer_url(client: httpx.AsyncClient, url: str) -> str:
reponse = await client.get(url)
return reponse.text
async def recuperer_plusieurs(urls: list[str]) -> list[str]:
async with httpx.AsyncClient() as client:
taches = [recuperer_url(client, url) for url in urls]
return await asyncio.gather(*taches)
GIL optionnel en Python 3.13¶
Python 3.13 introduit le mode free-threaded (PEP 703) qui permet de désactiver le GIL à la compilation. Cette fonctionnalité est experimentale mais représenté un tournant majeur pour le parallélisme Python.
# Installer Python 3.13 free-threaded via pyenv
pyenv install 3.13t
# Verifier
python3.13t -c "import sys; print(sys._is_gil_enabled())"
# False
Attention — Compatibilité free-threaded : Le mode free-threaded Python 3.13 peut introduire des conditions de course dans du code qui assumait la protection du GIL. Les librairies tierces doivent être explicitement declarees compatibles via Py_GIL_DISABLED.
Python dans l'écosystème open source¶
Python beneficie d'un écosystème de contributions parmi les plus actifs du monde open source :
- PyPI (Python Package Index) heberge plus de 500 000 paquets
- La PSF (Python Software Foundation) géré la marque, les grants et PyCon
- PyCon est la conference annuelle principale, avec des editions locales dans 60+ pays
- Les sprints de contribution ont lieu chaque année autour de PyCon US
La transparence du processus de gouvernance (PEP publiques, steering council elu, votes ouverts) contribue à la confiance de la communauté dans l'évolution du langage.