2A.i - Sérialisation#

Links: notebook, html, python, slides, GitHub

Charger un dataframe depuis un fichier texte prend du temps car il faut convertir le texte en nombre. La sérialisation permet de copier le contenu depuis la mémoire vers le disque. A la prochaine utilisation, Python a juste besoin de recopier le bloc depuis le disque et de le copier sans trop le modifier en mémoire. Sérialiser un dataframe permet de le récupérer beaucoup plus vite.

from jyquickhelper import add_notebook_menu
add_notebook_menu()

Sérialisation#

La sérialisation désigne l’action de sauvegarder un objet dans un fichier telle qu’il est représentée dans la mémoire de l’ordinateur. De cette façon, la relecture de l’objet en question est plus rapide. La difficulté réside dans la sérialisation d’objets composites comme une liste qui contient un dictionnaire qui contient une liste d’autres listes. Sans rentrer dans le détail de l’implémentation, la plupart des objets en Python sont sérialisables ainsi qu’un objet composé de ces objets. Cela s’effectue avec le module pickle.

import pickle
l = [ {3:"4"}, "4", -5.5, [6, None]]
with open("objet_serialise.bin", "wb") as f :
    pickle.dump(l, f)

Puis on récupère les données :

with open("objet_serialise.bin", "rb") as f :
    obj = pickle.load(f)
obj
[{3: '4'}, '4', -5.5, [6, None]]

DataFrame#

Il existe une méthode spécifique pour les DataFrame : to_pickle qu’on relie avec la méthode read_pickle.

import pandas
df = pandas.DataFrame( [ {"name":"xavier", "school":"ENSAE"},
                         {"name":"antoine", "school":"ENSAE"} ] )
df.to_pickle("df_serialize.bin")

Puis on relit le fichier :

df2 = pandas.read_pickle("df_serialize.bin")
df2
name school
0 xavier ENSAE
1 antoine ENSAE

Exercice 1 : sérialisation d’un gros dataframe#

On veut comparer le temps de chargement du même dataframe depuis un fichier texte et depuis un contenant le dataframe sérialisé. Dans un premier temps, on génère un gros dataframe qu’on sauve sous fichier texte puis on le sérialise. On compare ensuite les temps de chargement.

Exercice 2 : sérialisation json#

Le module pickle produit des fichiers binaires qui ne sont pas lisible autrement que par Python. Et le format peut changer d’une version de Python à l’autre. On lui préfère souvent un format texte comme json. Reprendre l’exercice 1 avec le module jsonpickle.

Question

Que veut dire un message comme celui-ci présent dans la documentation de jsonpickle ?

::

Warning jsonpickle can execute arbitrary Python code. Do not load jsonpickles from untrusted / unauthenticated sources.

Autre option : dill#

Le module dill étend un peu les fonctionnalité de pickle. Ce dernier a quelques soucis pour récupérer des objets sérialisés avec d’autres versions de Python. dill est encore à l’état de développement mais il devrait être plus robuste dans ce cas particulier.