.. _td2acenoncesession2Erst: ==================== 2A.i - Sérialisation ==================== .. only:: html **Links:** :download:`notebook `, :downloadlink:`html `, :download:`python `, :downloadlink:`slides `, :githublink:`GitHub|_doc/notebooks/td2a/td2a_cenonce_session_2E.ipynb|*` 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. .. code:: ipython3 from jyquickhelper import add_notebook_menu add_notebook_menu() .. contents:: :local: 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 `__. .. code:: ipython3 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 : .. code:: ipython3 with open("objet_serialise.bin", "rb") as f : obj = pickle.load(f) obj .. parsed-literal:: [{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 `__. .. code:: ipython3 import pandas df = pandas.DataFrame( [ {"name":"xavier", "school":"ENSAE"}, {"name":"antoine", "school":"ENSAE"} ] ) df.to_pickle("df_serialize.bin") Puis on relit le fichier : .. code:: ipython3 df2 = pandas.read_pickle("df_serialize.bin") df2 .. raw:: html
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.