2010-06-05 7 views

Répondre

1

Les compréhensions de liste et les expressions de générateur sont généralement considérées comme plus pythoniques. Lorsque vous écrivez du code python, il est préférable d'utiliser les expressions de liste et les expressions de générateur simplement parce que c'est la façon dont les programmeurs python ont tendance à faire les choses.

Mappez et filtrez les objets de la liste de retour, tout comme les listes de compréhension. Les expressions de générateur renvoient un générateur. Avec un générateur, le calcul se produit au besoin au lieu de calculer et de stocker les résultats. Cela peut entraîner une diminution de l'utilisation de la mémoire si les tailles d'entrée sont grandes. De plus, gardez à l'esprit que les générateurs ne sont pas indexables. Ils doivent être lus séquentiellement. Vous trouverez ci-dessous quelques exemples de l'utilisation de la mémoire lors de l'utilisation de différentes méthodes pour transformer une séquence de nombres et les additionner à l'aide de la compréhension de liste, des expressions de générateur et de la carte.

k=1000 

def transform(input): 
    return input + 1 

""" 
    1. range(k) allocates a k element list [0...k] 
    2. Iterate over each element in that list and compute the transform 
    3. Store the results in a list 
    4. Pass the list to sum 

Memory: Allocates enough 2 lists of size k 
""" 
print sum([transform(i) for i in range(k)]) 

""" 
    1. Create an xrange object 
    2. Pass transform and xrange object to map 
    3. Map returns a list of results [1...k+1] 
    4. Pass list to sum 

Memory: Creates a constant size object and creates a list of size k 
""" 
print sum(map(transform, xrange(k))) 

""" 
    1. Create an xrange object 
    2. Create a generator object 
    3. Pass generator object to sum 

Memory: Allocates 2 objects of constant size 
""" 
print sum(transform(i) for i in xrange(k)) 

""" 
Create a generator object and operate on it directly 
""" 
g = (transform(i) for i in xrange(k)) 
print dir(g) 
print g.next() 
print g.next() 
print g.next() 
+0

* « Carte et filtre proviennent de langues plus fonctionnels ». * Comme mutations de listes (qui ont été inspirés par la fonction dans Haskell) et les expressions du générateur (qui descendent de compréhensions de liste et - vraiment - sont plus comme les types d'opérations que vous exécuteriez dans un langage fonctionnel non strict.) –

+0

Je connais les définitions. Je veux connaître les raisons pour lesquelles vous voudriez utiliser la carte sur une compréhension de liste. – hekevintran

+0

Mauvais phrasé de ma part donc je l'ai coupé. Dans mon expérience map/filter sont plus utilisés dans les langages fonctionnels (bien que fonctionnels) plus que la compréhension de liste juste parce que la compréhension de liste serait sucre syntaxique sur la carte/filtre et je sais que beaucoup de langues essayent de limiter le nombre de manières chats. – Evan

Questions connexes