2019-05-20 Quelques modules intéressants

Une liste de modules à suivre. Un benchmark sur pandas pour commencer : Fast-Pandas. On voit que en deça de 10.000 lignes, l’ordinateur passe son temps surtout dans le code python. Après, il fait enfin un peu de calcul.

Pédagogie

Algojammer fonctionne un peu comme PythonTutor mais il est plus adapté aux algorithmes qui manipulent de grandes données.

Web

vibora : plus rapide que tout ce qui existe car écrit en :epkg:`cython`. Le plus rapide est probablement ja-pronto mais il n’a pas l’air d’être vraiment maintenu. Le site mentionne que le projet est en cours de réécriture.

Entre temps, je me suis dirigé sur starlette, hypercorn, uvicorn, falcon

Ligne de commande

python-nubia : pour créer des lignes de commandes facilement. C’est plus rapide que ce que j’avais en tête avec la fonction cli_main_helper qui parse la documentation pour construire la documentation de la fonction. Malheureusement, cela inclut docutils et sphinx qui sont des dépendances assez longues à charger. Cette option est plus déclarative.

Optimisation

pymagnitude : calculer les prédictions de modèles de deep learning un peu plus vite.

lmdb-embeddings est une autre option qui permet de stocker les coefficients sur un disque SSD, moins de choses en mémoire pour une perte très légère en performance.

Workflow

faust : traiter en temps réel des événements avec Kafka.

botflow ou comment créer des workflows pour manipuler les données et donc faire du machine learning sur des données conséquentes. Plus simple que luigi, fonctionne en local. Bref, il faut avoir du temps et un besoin pour rentrer dans tout ça : Data pipelines, Luigi, Airflow: everything you need to know.

Logging, Profiling, Refactoring

pampy permet de retrouver des informations dans des grosses structures de données. Utile pour débugger.

Bowler est un outil pour faire du refactoring. Il se balade dans le code avec des arbres syntaxiques.

pyre-check : vérifie les annotations.

py-spy est un profileur qui regarde régulièrement où en est un programme. A la fin de l’exécution, il compte le nombre de fois qu’il était dans telle ou telle fonction. Ces profileurs dits sampling profiler sont en général plus rapide car ils ne modifient pas le programme.

loguru : pour logger plus facilement que logging. Pas mal pour logger les call stack :

logger.add("output.log", backtrace=True, diagnose=True)  # Set 'False' to not leak sensitive data in prod

def func(a, b):
    return a / b

def nested(c):
    try:
        func(5, c)
    except ZeroDivisionError:
        logger.exception("What?!")

nested(0)

Ce qui donne :

2018-07-17 01:38:43.975 | ERROR    | __main__:nested:10 - What?!
Traceback (most recent call last):

  File "test.py", line 12, in <module>
    nested(0)
    + <function nested at 0x7f5c755322f0>

> File "test.py", line 8, in nested
    func(5, c)
    ¦       + 0
    + <function func at 0x7f5c79fc2e18>

  File "test.py", line 4, in func
    return a / b
           ¦   + 0
           + 5

ZeroDivisionError: division by zero