python carte fonction agissant sur une chaîne de nombres
J'ai été jouer avec la carte de fonction en Python et j'ai été à la recherche pour certains vous aider à comprendre le comportement suivant:
foo="12345"
print map(int,foo)
vous donne [1, 2, 3, 4, 5]
. Évidemment int(foo)
crache 12345
. Donc ce qui se passe exactement? Depuis les chaînes de caractères sont itératif par caractère, les deux lignes ci-dessus, synonyme de
print [int(x) for x in foo]
Je sais qu'ils seront de sortie le même résultat mais est-il quelque chose de différent se passe derrière les coulisses? Est un des plus efficaces ou mieux qu'un autre? Est un de plus "pythonic"?
Merci beaucoup!
- docs.python.org/release/1.4/tut/...
- Cela tombe dans le domaine de l'opinion. Avis: Ils sont fonctionnellement similaires et c'est un peu la préférence de l'utilisateur.
map
horloge un peu plus vite; compréhension de Liste est plus immédiatement évidente à des tiers les yeux.
Vous devez vous connecter pour publier un commentaire.
map()
peut-être un peu plus rapide que l'utilisation de la liste de compréhension dans certains cas et dans certains cas, la carte est plus lente que les interprétations de la liste.lors de l'utilisation d'une fonction intégrée:
avec
lambda
,map()
devient lent:Mais, en python 3x
map()
retourne un objet map, c'est à dire un itérateurxs
pour?De la documentation de
map
int()
tentatives à convertir ce qui est passé en un entier et de soulever unValueError
si vous essayez quelque chose de stupide, comme ceci:map()
, vous obtiendrez une liste, qui a la valeur de retour de la fonction que vous lui demandez d'appeler pour n'importe quel itérable. Si votre fonction ne retourne rien, alors vous obtiendrez une liste deNone
s, comme ceci:C'est le court et efficace moyen de faire quelque chose comme ceci:
map
peut être pensé à ceci:Fondamentalement, il renvoie une liste
L
tels que le i-ème élément deL
est le résultat du calculfunc
sur le i-ème élément de votre itératif.Donc, avec
int
et une chaîne deint
s, à chaque itération de la boucle for, l'élément est un caractère spécifique, qui lorsqu'il est administré àint
revient comme un véritableint
. Le résultat de l'appelmap
sur une telle chaîne est une liste, dont les éléments correspondent à laint
ed valeurs du caractère correspondant dans la chaîne.Donc oui, si
L = "12345"
, puismap(int, L)
est synonyme de[int(x) for x in L]
Espère que cette aide
Et le calendrier:
"Plus efficace" est une boîte de pandore. Sur cet ordinateur, il est plus rapide d'utiliser la carte avec Disponible, mais la compréhension de liste est plus rapide pour les pypy
Python3 montre
map()
pour être plus rapide, même avec l'appel supplémentaire àlist()
qui est nécessaireOui, il y a une énorme différence en coulisses. Si vous
print(map)
vous verrez que c'est un builtin. Un builtin fonction exécute plus rapidement que celui écrit en python ou que la plupart basées sur la façon dont la langue est analysée, la carte utilise la rapide iter méthode, une compréhension de liste ne pas. D'autres qu'il n'y a pas de différence.vs
L'aide Disponible, et le temps unix programme, carte complète dans ~3 secondes, la compréhension de liste dans ~5.
Oh, encore une chose à noter, cette applique uniquement lorsque la fonction transmise à la carte est écrit en C.
int
etmap
sont tous deux construits ins.map
n'est pas plus rapide dans ce cas parce que carte est un builtin, c'est parce que int est un builtin. Le gain de performance est si petit pour les dernières versions de Python qu'il ne vaut vraiment pas à l'aide demap
pour cette seule raison