2015-08-11 1 views
-3

J'ai besoin de parcourir une liste en arrière. J'ai lu à propos de xrange() et de reverse(). Lequel est le plus cher?inversé() vs xrange()

+5

'xrange' et' reversed' font des choses complètement différentes? – muddyfish

+1

Demandez-vous si vous devez utiliser off-by-one-error sujette 'xrange (n, -1, -1)' ou si elle est aussi rapide 'reverse (xrange (n + 1))'? Selon '% timeit', les deux sont à peu près aussi rapides. –

+3

Je vous renvoie à la documentation de ['__reversed__'] (https://docs.python.org/2/reference/datamodel.html#object.__reversed__)" Si la méthode '__reversed __()' n'est pas fournie, le 'reverse()' intégré retombera en utilisant le protocole de séquence ('__len __()' et '__getitem __()'). Les objets qui supportent le protocole de séquence devraient seulement fournir '__reversed __()' s'ils peuvent fournir une implémentation c'est plus efficace que celui fourni par 'reverse()'. " – NightShadeQueen

Répondre

2

Vous pouvez utiliser la bibliothèque timeit de Python pour chronométrer des choses comme celle-ci. Vous ne dites pas quel genre de liste vous avez, donc je suppose une simple liste de chaînes. D'abord, je crée une liste de 100 articles longs et temps à la fois:

my_list = ["hello"] * 100 

def v1(): 
    for x in my_list[::-1]: 
     pass 

def v2(): 
    for x in reversed(my_list): 
     pass 

print timeit.timeit(v1) 
print timeit.timeit(v2) 

Cela donne le résultat suivant:

2.78170533583 
2.13084949985 

Comme vous pouvez le voir, dans cet exemple reversed() est un peu plus rapide.

+0

Inutile si la création de la liste est à l'intérieur de la mesure. (Sinon +1) – kay

+0

En effet, bien repéré. –

+0

Nouveau dans cela, assez clair, et geez, a appris sur le temps. Merci! Je travaille en effet avec des listes simples. Et en tant que mise en œuvre backend, j'avais besoin de savoir ce qui coûte moins de temps. Donc, assez clair. – GJntN

2

xrange() produit une séquence de nombres. Vous pouvez ensuite utiliser ces numéros comme index de liste si vous le souhaitez, ou vous pouvez les utiliser pour n'importe quel endroit où vous voulez ces numéros.

for i in xrange(len(l)-1, -1, -1): 
    item = l[i] 
    print item 

reversed() produit les éléments de quelque chose qui a une longueur et peut être indexé.

for item in reversed(l): 
    print item 

J'utiliser reversed() car il vous rend le code plus court, plus simple, plus claire et plus facile d'écrire correctement.

+0

Vous pouvez également utiliser un générateur 'pour item dans (l [i] pour i dans xrange (len (l) -1, -1, -1)): ... '. (Attention: cela peut amener d'autres personnes à vous détester quand ils doivent lire le code.) – kay

+1

En effet ... vous pourriez alors mettre votre générateur dans une fonction et l'appeler inverse(). :) – dsh