MFormations
Modern Python Engineering

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

  1. Python 3.13 Free-Threaded
  2. JIT Compilation
  3. AI / LLM Revolution
  4. Rust / PyO3
  5. Polars vs Pandas
  6. FastAPI Ecosystem
  7. Mojo Language
  8. 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

  1. Calcul parallèle natif : plus besoin de multiprocessing pour le CPU-bound
  2. Performance I/O : meilleure scalabilité des serveurs web
  3. Data Science : pandas, numpy pourront paralléliser plus facilement
  4. Adoption : probablement stable en Python 3.15 ou 3.16

Compatibilité des bibliothèques

BibliothèqueStatut free-threadedRemarque
numpy✅ CompatibleDepuis numpy 2.1
pandas✅ CompatibleDepuis pandas 2.2
scikit-learn✅ CompatibleDepuis 1.5
Cython⚠️ PartielNé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

BenchmarkSans JITAvec JITGain
Appels de fonction100 ns75 ns25 %
Boucles serrées50 ns/iter35 ns/iter30 %
Opérations arithmétiques10 ns8 ns20 %
Accès aux attributs40 ns30 ns25 %

Comparaison avec d'autres implémentations

ImplémentationApprochePerformance relative
CPython (no JIT)Interpréteur1x (référence)
CPython (JIT 3.13)Copy-and-patch~1.3x
PyPyJIT traceur~4-10x
PystonJIT + inline cache~2-3x
CythonCompilé C~10-50x
MojoCompilé 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

AssistantTechnologieIntégration
GitHub CopilotGPT-4oVSCode, JetBrains
CursorCustom LLMIDE dédié
CodeiumIn-house modelVSCode, JetBrains
Amazon CodeWhispererAWS BedrockVSCode, JetBrains
TabnineMultiple modelsMulti-IDE

Impact sur les métiers Python

  1. Productivité : génération de code boilerplate, documentation, tests
  2. Apprentissage : explication de code, tutoriels personnalisés
  3. Revue de code : détection de bugs, suggestions d'amélioration
  4. 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èrePython purC ExtensionRust (PyO3)
PerformanceLentTrès rapideTrès rapide
Sécurité mémoireGCManuelGarantie compilation
ProductivitéÉlevéeFaibleMoyenne
ÉcosystèmeRicheLimitéCroissance rapide
MaintenanceFacileDifficileModé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

ProjetRôleTechnologie
ruffLinter/Formatter PythonRust natif
pydantic-coreValidation enginePyO3
uvPackage managerRust natif
polarsDataFrame libraryRust natif
tokenizersNLP tokenizationPyO3
cryptographyCrypto primitivesRust + C
orjsonJSON parserRust 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

  1. Performance : Rust offre des gains de 10x à 100x
  2. Sécurité : pas de segmentation fault, pas de buffer overflow
  3. Écosystème : maturité de PyO3, maturin, rust-numpy
  4. Adoption : les nouveaux outils Python sont écrits en Rust
  5. 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érationpandaspolars (eager)polars (lazy)
Lecture5.2s1.8s0.9s (scan)
GroupBy3.1s0.8s0.6s (optimisé)
Total8.3s2.6s1.5s (lazy)
Mémoire2 Go500 Mo300 Mo

Avantages de Polars

  1. Performance : 5-10x plus rapide que pandas
  2. Mémoire : consommation réduite (Arrow, zero-copy)
  3. Lazy execution : optimisation automatique des requêtes
  4. API expressive : chaînage fluent, typage fort
  5. Parallélisation : multi-core par défaut
  6. Streaming : traitement de datasets plus grands que la RAM

Avantages de pandas

  1. Maturité : 15 ans d'existence, écosystème immense
  2. Documentation : ressources, livres, tutoriels
  3. Compatibilité : tout l'écosystème data Python
  4. Facilité : API plus simple pour les débutants
  5. 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èreFastAPIDjango RESTFlaskLitestar
Performance⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Productivité⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Async natif⚠️
ValidationsPydantic natifManuelManuelPydantic
DocumentationAuto (Swagger)DRF-YASGFlasggerAuto
ORMIndépendantDJango ORMIndépendantIndépendant
CommunautéTrès activeTrès activeTrès activeNaissante
EmploiCroissance rapideStableEn déclinRare

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

  1. Type-safe DI : adoption massive de Annotated
  2. OpenTelemetry : tracing intégré
  3. Background tasks : amélioration des tâches asynchrones
  4. WebSocket amélioré : gestion des connexions longue durée
  5. GraphQL : Strawberry + FastAPI
  6. gRPC : intégration via grpcio-reflection
  7. 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èrePythonMojo
Performance1x~1000x (CPU-bound)
TypageOptionnel (hints)Optionnel + fort
CompilationInterprétéCompilé (MLIR)
ÉcosystèmeImmenseCompatible Python
Maturité30+ ans< 2 ans
AdoptionGénéralisteNiche (HPC/ML)
GILOui (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)

  1. Python reste dominant en data science, ML, backend, scripting
  2. Performance : Python 3.13 free-threaded + JIT → ~2x plus rapide
  3. Rustification : les outils Python sont progressivement réécrits en Rust
  4. Polars remplace pandas pour les gros volumes (pandas reste pour les petits)
  5. FastAPI devient le framework web par défaut pour les nouvelles apps
  6. AI/LLM : Python reste LE langage de l'IA
  7. Mojo : reste un langage de niche pour le HPC
  8. 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

  1. Investissez dans Python 3.13+ : apprenez le free-threaded mode
  2. Adoptez les type hints : devenez strict avec mypy
  3. Explorez Rust : même sans l'utiliser en production, comprenez PyO3
  4. Testez Polars : comparez avec pandas sur vos workloads
  5. Suivez FastAPI : l'écosystème évolue rapidement
  6. Expérimentez avec l'IA : LangChain, Ollama, Hugging Face
  7. 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 :