Chapitre 24
Chapitre 24 : Tendances Python
> **Les tendances actuelles et futures** qui façonnent l'écosystème Python.
Chapitre 24 — Tendances Python
Version : 1.0.0
Analyse des 7 tendances majeures qui façonnent l'avenir de l'écosystème Python.
Table des matières
- Python 3.13 Free-Threaded
- JIT Compilation
- AI / LLM Revolution
- Rust / PyO3
- Polars vs Pandas
- FastAPI Ecosystem
- Mojo Language
- Conclusion : Quel avenir pour Python ?
1. Python 3.13 Free-Threaded
Contexte
Depuis sa création, CPython est protégé par le GIL (Global Interpreter Lock) qui empêche l'exécution parallèle de bytecode par plusieurs threads natifs. Python 3.13 introduit un mode free-threaded (expérimental) où le GIL peut être désactivé.
Comment ça marche
# Installation de Python 3.13 free-threaded
# Sur Linux : python3.13t
# Activation via variable d'environnement
export PYTHON_GIL=0
# Vérification
python -c "import sys; print(sys._is_gil_disabled())"
# True si le GIL est désactivé
Performance
import threading
import time
def count(n: int) -> None:
while n > 0:
n -= 1
# Avec GIL (Python 3.12)
# 2 threads = pas plus rapide qu'1 thread
# Sans GIL (Python 3.13 free-threaded)
# 2 threads ≈ 2x plus rapide pour le CPU-bound
Limitations
- Expérimental : pas recommandé pour la production en 3.13
- Extensions C : beaucoup ne sont pas encore compatibles
- Consommation mémoire : légèrement plus élevée
- Verrous fins : certains codes peuvent devenir plus lents
Impact attendu
- Calcul parallèle natif : plus besoin de
multiprocessingpour le CPU-bound - Performance I/O : meilleure scalabilité des serveurs web
- Data Science : pandas, numpy pourront paralléliser plus facilement
- Adoption : probablement stable en Python 3.15 ou 3.16
Compatibilité des bibliothèques
| Bibliothèque | Statut free-threaded | Remarque |
|---|---|---|
| numpy | ✅ Compatible | Depuis numpy 2.1 |
| pandas | ✅ Compatible | Depuis pandas 2.2 |
| scikit-learn | ✅ Compatible | Depuis 1.5 |
| Cython | ⚠️ Partiel | Nécessite adaptations |
| mypy | ✅ Compatible | |
| ruff | ✅ Compatible | Écrit en Rust |
| fastapi | ✅ Compatible | |
| sqlalchemy | ✅ Compatible |
2. JIT Compilation
Contexte
Python 3.13 introduit un compilateur JIT (Just-In-Time) expérimental basé sur un méga-bytecode (copy-and-patch). L'objectif est d'améliorer les performances sans changer le modèle mental de Python.
Architecture
Code Python
│
▼
Bytecode (CPython 3.13)
│
├── Interpréteur classique (sans JIT)
│
└── Compilateur JIT (copy-and-patch)
│
▼
Code machine optimisé
│
▼
Exécution native
Comment l'activer
# Python 3.13 avec JIT
python -X jit script.py
# Vérifier si le JIT est actif
python -X jit -c "
import sys
print(sys.flags.jit) # True si JIT activé
"
Benchmarks préliminaires
| Benchmark | Sans JIT | Avec JIT | Gain |
|---|---|---|---|
| Appels de fonction | 100 ns | 75 ns | 25 % |
| Boucles serrées | 50 ns/iter | 35 ns/iter | 30 % |
| Opérations arithmétiques | 10 ns | 8 ns | 20 % |
| Accès aux attributs | 40 ns | 30 ns | 25 % |
Comparaison avec d'autres implémentations
| Implémentation | Approche | Performance relative |
|---|---|---|
| CPython (no JIT) | Interpréteur | 1x (référence) |
| CPython (JIT 3.13) | Copy-and-patch | ~1.3x |
| PyPy | JIT traceur | ~4-10x |
| Pyston | JIT + inline cache | ~2-3x |
| Cython | Compilé C | ~10-50x |
| Mojo | Compilé MLIR | ~1000x+ |
Roadmap
- Python 3.13 : JIT expérimental, désactivé par défaut
- Python 3.14 : JIT amélioré, peut-être activé par défaut
- Python 3.15+ : JIT optimisé, targeting ~2x performance
3. AI / LLM Revolution
Contexte
L'explosion de l'IA générative (LLM) a profondément impacté l'écosystème Python. Python est LE langage de l'IA, et la tendance s'accélère.
Python dans l'écosystème AI
Applications
├── LangChain / LlamaIndex (orchestration LLM)
├── FastAPI (déploiement d'API LLM)
├── Hugging Face Transformers (modèles pré-entrainés)
├── PyTorch / JAX (deep learning)
├── scikit-learn (ML classique)
└── pandas / polars (data preparation)
Bibliothèques clés
LangChain & LlamaIndex
from langchain_community.llms import Ollama
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template(
"Explique {concept} simplement."
)
llm = Ollama(model="llama3")
chain = prompt | llm
result = chain.invoke({"concept": "JIT compilation"})
Hugging Face Transformers
from transformers import pipeline
classifier = pipeline("sentiment-analysis")
result = classifier("Python is amazing!")
# [{'label': 'POSITIVE', 'score': 0.999}]
LLM Locaux (Ollama, llama.cpp)
# Installation
curl -fsSL https://ollama.com/install.sh | sh
# Lancer un modèle
ollama pull llama3.2
ollama run llama3.2
# API Python
import httpx
response = httpx.post("http://localhost:11434/api/generate", json={
"model": "llama3.2",
"prompt": "Hello!",
"stream": False,
})
AI Assistants pour le développement
| Assistant | Technologie | Intégration |
|---|---|---|
| GitHub Copilot | GPT-4o | VSCode, JetBrains |
| Cursor | Custom LLM | IDE dédié |
| Codeium | In-house model | VSCode, JetBrains |
| Amazon CodeWhisperer | AWS Bedrock | VSCode, JetBrains |
| Tabnine | Multiple models | Multi-IDE |
Impact sur les métiers Python
- Productivité : génération de code boilerplate, documentation, tests
- Apprentissage : explication de code, tutoriels personnalisés
- Revue de code : détection de bugs, suggestions d'amélioration
- Déploiement : API LLM, RAG, agents autonomes
Risques et limites
- Précision : les LLM peuvent produire du code incorrect
- Sécurité : injection de code, données sensibles dans les prompts
- Dépendance : risque de perte de compétences fondamentales
- Coût : API LLM coûteuses pour les grands volumes
- Environnement : consommation énergétique des LLM
4. Rust / PyO3
Contexte
Rust devient le langage de choix pour écrire des extensions Python performantes. PyO3 est la bibliothèque qui permet d'écrire des modules natifs Python en Rust.
Pourquoi Rust + Python ?
| Critère | Python pur | C Extension | Rust (PyO3) |
|---|---|---|---|
| Performance | Lent | Très rapide | Très rapide |
| Sécurité mémoire | GC | Manuel | Garantie compilation |
| Productivité | Élevée | Faible | Moyenne |
| Écosystème | Riche | Limité | Croissance rapide |
| Maintenance | Facile | Difficile | Modérée |
Exemple PyO3
// lib.rs
use pyo3::prelude::*;
#[pyfunction]
fn fibonacci(n: u64) -> u64 {
match n {
0 => 0,
1 => 1,
_ => fibonacci(n - 1) + fibonacci(n - 2),
}
}
#[pymodule]
fn rust_ext(m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_function(wrap_pyfunction!(fibonacci, m)?)?;
Ok(())
}
# Cargo.toml
[package]
name = "rust-ext"
version = "0.1.0"
edition = "2021"
[lib]
name = "rust_ext"
crate-type = ["cdylib"]
[dependencies]
pyo3 = { version = "0.22", features = ["extension-module"] }
# Build
maturin develop
# Ou
pip install .
# Utilisation Python
import rust_ext
print(rust_ext.fibonacci(30)) # 832040
Projets Rust+Python notables
| Projet | Rôle | Technologie |
|---|---|---|
| ruff | Linter/Formatter Python | Rust natif |
| pydantic-core | Validation engine | PyO3 |
| uv | Package manager | Rust natif |
| polars | DataFrame library | Rust natif |
| tokenizers | NLP tokenization | PyO3 |
| cryptography | Crypto primitives | Rust + C |
| orjson | JSON parser | Rust natif |
Performance ruff vs flake8
# ruff est 50-100x plus rapide que flake8
ruff check . # 200ms pour 10000 fichiers
flake8 . # 10s pour 10000 fichiers
Pourquoi c'est une tendance
- Performance : Rust offre des gains de 10x à 100x
- Sécurité : pas de segmentation fault, pas de buffer overflow
- Écosystème : maturité de PyO3, maturin, rust-numpy
- Adoption : les nouveaux outils Python sont écrits en Rust
- Emploi : développeurs Python+Rust très recherchés
5. Polars vs Pandas
Contexte
Polars est une bibliothèque de DataFrames écrite en Rust, conçue pour être plus rapide et plus efficace que pandas. Elle utilise Arrow comme format de mémoire sous-jacent et tire parti du lazy evaluation.
Comparaison
import pandas as pd
import polars as pl
# pandas
df_pd = pd.read_csv("large_file.csv")
result_pd = (
df_pd
.groupby("category")
.agg({"sales": "sum", "profit": "mean"})
.reset_index()
)
# polars (eager)
df_pl = pl.read_csv("large_file.csv")
result_pl = (
df_pl
.group_by("category")
.agg(pl.sum("sales"), pl.mean("profit"))
)
# polars (lazy — optimisé)
query = (
pl.scan_csv("large_file.csv")
.group_by("category")
.agg(pl.sum("sales"), pl.mean("profit"))
)
result_lazy = query.collect() # Exécution optimisée
Benchmark (groupby + agg sur 1 Go CSV)
| Opération | pandas | polars (eager) | polars (lazy) |
|---|---|---|---|
| Lecture | 5.2s | 1.8s | 0.9s (scan) |
| GroupBy | 3.1s | 0.8s | 0.6s (optimisé) |
| Total | 8.3s | 2.6s | 1.5s (lazy) |
| Mémoire | 2 Go | 500 Mo | 300 Mo |
Avantages de Polars
- Performance : 5-10x plus rapide que pandas
- Mémoire : consommation réduite (Arrow, zero-copy)
- Lazy execution : optimisation automatique des requêtes
- API expressive : chaînage fluent, typage fort
- Parallélisation : multi-core par défaut
- Streaming : traitement de datasets plus grands que la RAM
Avantages de pandas
- Maturité : 15 ans d'existence, écosystème immense
- Documentation : ressources, livres, tutoriels
- Compatibilité : tout l'écosystème data Python
- Facilité : API plus simple pour les débutants
- Visualisation : intégration matplotlib, seaborn native
Quand utiliser quoi ?
# Utilisez pandas quand :
# - Vous travaillez avec des datasets < 1 Go
# - Vous utilisez des bibliothèques qui dépendent de pandas
# - Vous faites du prototypage rapide
# - Vous avez besoin de visualisation immédiate
# Utilisez polars quand :
# - Vous travaillez avec des datasets > 1 Go
# - La performance est critique
# - Vous faites du streaming de données
# - Vous avez besoin de parallélisation automatique
# - Vous voulez minimiser la mémoire utilisée
Interopérabilité
import polars as pl
import pandas as pd
# Polars → pandas
df_pd = df_pl.to_pandas()
# pandas → Polars
df_pl = pl.from_pandas(df_pd)
# Polars → Arrow (pyarrow)
import pyarrow as pa
table = df_pl.to_arrow()
Tendances futures
- Polars 1.0 (2024) : stabilisation de l'API, adoption massive
- Narwhals : bibliothèque qui unifie pandas/polars/pyarrow API
- SQL on Polars : requêtes SQL sur des DataFrames Polars
6. FastAPI Ecosystem
Contexte
FastAPI est devenu le framework web Python le plus populaire pour les nouvelles applications. Son écosystème s'étend bien au-delà du framework lui-même.
L'écosystème complet
FastAPI Ecosystem 2024
├── Core
│ ├── FastAPI (framework)
│ ├── Starlette (ASGI basé)
│ └── Pydantic (validation)
│
├── Database
│ ├── SQLAlchemy 2.0 (ORM)
│ ├── Alembic (migrations)
│ └── asyncpg (driver PostgreSQL)
│
├── Async
│ ├── httpx (client HTTP)
│ ├── anyio (gestion async)
│ └── uvicorn (serveur ASGI)
│
├── Auth
│ ├── python-jose (JWT)
│ ├── fastapi-users (gestion utilisateurs)
│ └── Authlib (OAuth)
│
├── Admin
│ ├── FastAPI Admin
│ ├── SQLAdmin
│ └── Starlette Admin
│
├── Docs
│ ├── Swagger UI (intégré)
│ ├── ReDoc (intégré)
│ └── Stoplight Elements
│
├── Testing
│ ├── pytest + httpx (TestClient)
│ └── pytest-asyncio
│
├── DevOps
│ ├── Docker (multi-stage)
│ ├── Gunicorn + Uvicorn
│ └── Nginx (reverse proxy)
│
└── AI/ML
├── LangServe (déploiement LLM)
└── MLflow (model serving)
FastAPI vs alternatives (2024)
| Critère | FastAPI | Django REST | Flask | Litestar |
|---|---|---|---|---|
| Performance | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Productivité | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| Async natif | ✅ | ⚠️ | ❌ | ✅ |
| Validations | Pydantic natif | Manuel | Manuel | Pydantic |
| Documentation | Auto (Swagger) | DRF-YASG | Flasgger | Auto |
| ORM | Indépendant | DJango ORM | Indépendant | Indépendant |
| Communauté | Très active | Très active | Très active | Naissante |
| Emploi | Croissance rapide | Stable | En déclin | Rare |
Nouveautés récentes (2024)
FastAPI 0.115+
from typing import Annotated
from fastapi import FastAPI, Depends
app = FastAPI()
# Nouveau : Annotated DI (PEP 593)
async def get_db() -> AsyncGenerator[AsyncSession, None]:
async with AsyncSessionLocal() as session:
yield session
# Plus propre que le Depends() traditionnel
@app.get("/items")
async def list_items(
db: Annotated[AsyncSession, Depends(get_db)],
page: Annotated[int, Query(ge=1)] = 1,
):
...
Tendances FastAPI
- Type-safe DI : adoption massive de
Annotated - OpenTelemetry : tracing intégré
- Background tasks : amélioration des tâches asynchrones
- WebSocket amélioré : gestion des connexions longue durée
- GraphQL : Strawberry + FastAPI
- gRPC : intégration via grpcio-reflection
- Serverless : AWS Lambda, Vercel, Cloudflare Workers
Quand ne PAS utiliser FastAPI
- Application avec un ORM Django existant
- Projet nécessitant un admin intégré (Django Admin)
- CMS / Site vitrine (Django CMS, Wagtail)
- Équipe maîtrisant déjà un autre framework
7. Mojo Language
Contexte
Mojo est un nouveau langage créé par Chris Lattner (créateur de LLVM, Swift, et MLIR). Il se positionne comme un superset de Python qui compile vers du code natif ultra-rapide.
Caractéristiques
- Syntaxe : proche de Python (mais PAS Python)
- Performance : comparable au C/C++/Rust (vs Python 1000x plus lent)
- Système : types optionnels, inférence, MLIR
- Écosystème : compatible Python (import de modules Python)
- Usage : calcul haute performance, ML, systèmes
Exemple
fn fibonacci(n: Int) -> Int:
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
def main():
print(fibonacci(40)) # Beaucoup plus rapide que Python
Comparaison avec Python
| Critère | Python | Mojo |
|---|---|---|
| Performance | 1x | ~1000x (CPU-bound) |
| Typage | Optionnel (hints) | Optionnel + fort |
| Compilation | Interprété | Compilé (MLIR) |
| Écosystème | Immense | Compatible Python |
| Maturité | 30+ ans | < 2 ans |
| Adoption | Généraliste | Niche (HPC/ML) |
| GIL | Oui (3.12) / Non (3.13) | Non (natif) |
Ce que Mojo n'est PAS
- ❌ Pas un remplacement de Python (pour la majorité des cas)
- ❌ Pas compatible 100 % Python (différences subtiles)
- ❌ Pas prêt pour la production (langage jeunes, API instable)
Positionnement
Python (généraliste, facile)
│
├── Mojo (HPC, ML, systèmes)
│
├── Rust (systèmes, performance)
│
└── C++ (legacy, jeux vidéo)
8. Conclusion : Quel avenir pour Python ?
Scénario probable (2025-2030)
- Python reste dominant en data science, ML, backend, scripting
- Performance : Python 3.13 free-threaded + JIT → ~2x plus rapide
- Rustification : les outils Python sont progressivement réécrits en Rust
- Polars remplace pandas pour les gros volumes (pandas reste pour les petits)
- FastAPI devient le framework web par défaut pour les nouvelles apps
- AI/LLM : Python reste LE langage de l'IA
- Mojo : reste un langage de niche pour le HPC
- Type hints : deviennent obligatoires dans les projets professionnels
Compétences clés pour 2025-2030
Must-have
├── Python 3.13+ (async, types, free-threaded)
├── FastAPI / Pydantic
├── SQLAlchemy 2.0 / Alembic
├── pytest (avancé : fixtures, mocking, hypothesis)
├── Docker / CI/CD
└── Git / GitHub
Nice-to-have
├── Rust (PyO3)
├── Polars (data engineering)
├── LangChain / LLM ops
├── AnyIO
├── Polars / narwhals
└── AI-assisted development
Emerging
├── Mojo
├── Free-threaded Python
├── JIT optimization
├── WebAssembly Python
└── Edge computing (Python on IoT)
Recommandations
- Investissez dans Python 3.13+ : apprenez le free-threaded mode
- Adoptez les type hints : devenez strict avec mypy
- Explorez Rust : même sans l'utiliser en production, comprenez PyO3
- Testez Polars : comparez avec pandas sur vos workloads
- Suivez FastAPI : l'écosystème évolue rapidement
- Expérimentez avec l'IA : LangChain, Ollama, Hugging Face
- Restez curieux : la seule constante est le changement
Ceci conclut le module Tendances Python ainsi que le programme Modern Python Engineering. Merci d'avoir suivi cette formation !
Happy Coding ! 🐍
Fichiers racine du projet
Voir les fichiers dans le dossier racine du repository :