Mise en cache forcée pour d'autres types d'objet en Python
En creusant un peu sur Internet, j'ai cru comprendre que l'équivalent du mécanisme de **small integer caching** s'appelait **string interning** pour les chaines de caractères. J'ai également découvert qu'on pouvait utiliser la fonction `sys.intern()` pour forcer Python à utiliser ce mécanisme sur les chaines de caractères.
Ma question est : existe-il une fonction similaire pour forcer la mise en cache des autres type d'objet comme un int ou un float par exemple ?
Singleton et small integer caching
Si vous avez fait quelques tests de votre côté avec la fonction id, vous avez peut-être remarqué quelques comportements bizarres.
Il y a en fait plusieurs processus d'optimisation qui sont réalisés par Python, afin d'avoir des scripts un peu plus rapides à exécuter.
Un singleton, c'est tout simplement un objet qui est unique. On va avoir ce concept, par exemple, avec le mot None ou encore les booléens True et False.
Si, dans un interpréteur Python, nous utilisons deux fois la fonction id sur le booléen True, on obtient exactement le même identifiant en mémoire.
>>>id(True)4304888192>>>id(True)4304888192
En revanche, si on réalise la même opération avec le nombre entier 500, on obtient deux identifiants différents.
>>>id(500)4533078288>>>id(500)4533077808
Avec le nombre entier 500, on a créé deux objets 500 qui sont différents en mémoire alors qu'avec True, on a le même objet en mémoire.
True est ce qu'on appelle un singleton. Plutôt que de recréer des objets qui seront tous similaires, Python crée un seul objet True en mémoire et nous retourne ce même objet chaque fois que nous y faisons appel.
Cela est vrai peu importe la façon dont on y accède, que ce soit en l'assignant à une variable ou en l'utilisant directement :
On retrouve le même comportement avec les nombres entre -5 et 256 (inclus).
Vous avez vu précédemment qu'avec le nombre 500, chaque fois qu'on faisait id(500), un nouvel objet était créé en mémoire.
Utilisons deux fois la fonction id sur le nombre 5.
>>>id(5)4305279584>>>id(5)4305279584
Le même "id" nous est retourné pour les deux nombres.
Pourquoi est-ce qu'avec 500 on a deux emplacements différents en mémoire, et pas avec 5 ?
C'est tout simplement une question d'optimisation.
Quand vous lancez votre script Python ou que vous ouvrez un interpréteur interactif, Python va assigner directement des places en mémoire pour les nombres de -5 à 256, et va ainsi pouvoir y accéder à chaque fois qu'on en a besoin.
>>>a=5>>>id(a)4305279584>>>id(5)4305279584
Là encore, on a le même emplacement en mémoire pour cette variable a que pour le nombre 5. Le même objet nombre entier5 nous est retourné à chaque fois.
En dehors de cette plage comprise entre -5 et 256, on aura des objets différents qui vont être créés à chaque fois, comme avec le nombre entier 500.
Dans cet exemple, on pourrait croire qu'on va avoir deux objets différents, mais l'emplacement en mémoire de ces deux variables est identique. Il s'agit donc bien du même objet.