Tester si un objet est déjà une chaîne est plus lent que de toujours convertir en chaîne.
C'est parce que le str()
effectue également le même test (l'objet est-il déjà une chaîne de caractères). Vous a) faites le double du travail, et b) votre test est plus lent.
Remarque : pour Python 2, l'utilisation de str()
en unicode
comprend un encodage implicite en ASCII, ce qui peut échouer. Il se peut que vous ayez à traiter ces objets dans des cas particuliers. En Python 3, il n'est pas nécessaire de s'inquiéter de ce cas limite.
Comme il y a une certaine discussion autour de cela :
-
isinstance(s, str)
a une signification différente lorsque s
peut être un sous-classe de str
. Comme les sous-classes sont traitées exactement comme n'importe quel autre type d'objet par str()
(soit __str__
o __repr__
est appelé sur l'objet), cette différence importe ici.
-
Vous devez utiliser type(s) is str
pour les contrôles de type exact. Les types sont des singletons, profitez-en, is
est plus rapide :
>>> import timeit
>>> timeit.timeit("type(s) is str", "s = ''")
0.10074466899823165
>>> timeit.timeit("type(s) == str", "s = ''")
0.1110201120027341
-
Utilisation de s if type(s) is str else str(s)
est nettement plus lent pour le cas de non-chaîne :
>>> import timeit
>>> timeit.timeit("str(s)", "s = None")
0.1823573520014179
>>> timeit.timeit("s if type(s) is str else str(s)", "s = None")
0.29589492800005246
>>> timeit.timeit("str(s)", "s = ''")
0.11716728399915155
>>> timeit.timeit("s if type(s) is str else str(s)", "s = ''")
0.12032335300318664
(Les horaires de la s = ''
sont très proches et ne cessent de s'échanger les places).
Tous les chronométrages de cet article ont été réalisés avec Python 3.6.0 sur un Macbook Pro 15" (mi 2015), OS X 10.12.3.
10 votes
Pour les objets de type chaîne, il s'agit de la chaîne elle-même. On dirait qu'il ne devrait pas y avoir de frais généraux.
2 votes
En Python 2, les deux extraits ne sont pas équivalents -.
str(u"ó")
soulèveUnicodeEncodeError
.2 votes
Notez que la vérification du type en utilisant
type(a)==str
n'est pas du tout une bonne pratique. Vous devriez plutôt utiliserisinstance()
à la place de la fonction intégrée.2 votes
@Kasramvd : sauf si vous devez tester pour le type exact, et ne pas autoriser les sous-classes. Dans ce cas, vous devriez utiliser
type(a) is str
car il est plus rapide.str
est un singleton, vous n'aurez pas deux types différentsstr
qui traîne et que ce test doit produireTrue
pour.0 votes
@MartijnPieters Oui, exactement.
0 votes
@WiktorStribizew Eh bien, il y a une certaine surcharge parce que l'appel de la fonction est toujours appelé. Il n'y a pas de surcharge de mémoire.