- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compte personSingleton 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.
Singleton
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 :
>>> c = True
>>> id(c)
4304888192
>>> id(True)
4304888192
Small integer caching
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 entier 5
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
.
Les chaînes de caractères
On va retrouver le même comportement avec certaines chaînes de caractères :
>>> a = "bonjour"
>>> b = "bonjour"
>>> id(a)
4534738424
>>> id(b)
4534738424
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.
Pour résumer
Les développeurs du langage Python ont intégré plusieurs processus d'optimisation au langage.
Il existe ainsi :
- Les singletons qui sont donc des objets comme
None
,True
ouFalse
. - Les nombres entre
-5
et256
inclus. - Certaines chaînes de caractères.
Ce n'est pas fini...
Tu as complété % du parcours 🔥
Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.