Je joue avec les compréhensions de listes et je suis tombé sur ce petit extrait sur un autre site:
return ''.join([`num` for num in xrange(loop_count)])
J'ai passé quelques minutes à essayer de reproduire la fonction (en tapant) avant de réaliser que le `num`
bit la cassait.
Que fait le fait d'inclure une déclaration dans ces caractères? D'après ce que je peux voir, c'est l'équivalent de str (num). Mais quand je l'ai chronométré:
return ''.join([str(num) for num in xrange(10000000)])
Cela prend 4.09s alors que:
return ''.join([`num` for num in xrange(10000000)])
prend 2,43 s.
Les deux donnent des résultats identiques mais l'un est beaucoup plus lent. Qu'est-ce qui se passe ici?
EDIT: Bizarrement ... repr()
donne des résultats légèrement plus lents que `num`
. 2,99 contre 2,43. Utilisation de Python 2.6 (je n'ai pas encore essayé la version 3.0).
python
list-comprehension
Dominique Bou-Samra
la source
la source
Réponses:
Les backticks sont un alias obsolète pour
repr()
. Ne les utilisez plus, la syntaxe a été supprimée dans Python 3.0.Utiliser des backticks semble être plus rapide que d'utiliser
repr(num)
ounum.__repr__()
en version 2.x. Je suppose que c'est parce qu'une recherche supplémentaire dans le dictionnaire est nécessaire dans l'espace de noms global (pourrepr
) ou dans l'espace de noms de l'objet (pour__repr__
), respectivement.L'utilisation du
dis
module prouve mon hypothèse:Démontage montre:
f1
implique une recherche globale pourrepr
,f2
une recherche d'attribut pour__repr__
, tandis que l'opérateur backtick est implémenté dans un opcode séparé. Comme il n'y a pas de surcharge pour la recherche dans le dictionnaire (LOAD_GLOBAL
/LOAD_ATTR
) ni pour les appels de fonction (CALL_FUNCTION
), les backticks sont plus rapides.Je suppose que les gens de Python ont décidé qu'avoir une opération de bas niveau séparée pour
repr()
ne valait pas la peine, et avoir à la foisrepr()
et des backticks viole le principedonc la fonctionnalité a été supprimée dans Python 3.0.
la source
Les citations Backtick ne sont généralement pas utiles et ont disparu dans Python 3.
Pour ce que ça vaut, ceci:
est légèrement plus rapide que la version backtick pour moi. Mais s'inquiéter à ce sujet est probablement une optimisation prématurée.
la source
timeit
donne des résultats plus rapides pour''.join(map(repr, xrange(0, 1000000)))
que pour''.join([repr(i) for i in xrange(0, 1000000)])
(encore pire pour''.join( (repr(i) for i in xrange(0, 1000000)) )
). C'est un peu décevant ;-)map
est implémenté en C, en utilisant une boucle C, qui est beaucoup plus rapide qu'une boucle Python exécutée dans la machine virtuelle.map
me semble parfaitement clair et concis, et je ne connais même pas Python.Je suppose que
num
cela ne définit pas la méthode__str__()
, ilstr()
faut donc faire une deuxième recherche__repr__
.Les backticks recherchent directement
__repr__
. Si c'est vrai, utiliser à larepr()
place des backticks devrait vous donner les mêmes résultats.la source