range(len(liste)) ou énumérer(liste)? [dupliquer]

possibilité de duplication:

seul indice nécessaire: énumérer ou (x) Fourchette?

lesquels seraient considérés comme meilleurs / plus clairs/plus rapides / plus "Pythoniques"? Je ne me soucie pas du contenu de la liste L , juste combien de temps il est.

a = [f(n) for n, _ in enumerate(L)]

ou

a = [f(n) for n in range(len(L))]

si cela fait une différence, le la fonction f utilise len(list) .

16
demandé sur Community 2012-08-16 19:02:12

4 réponses

certains tirages rapides semblent donner la 2e option en utilisant range() un léger bord au-dessus de enumerate() :

timeit a = [f(n) for n, _ in enumerate(mlist)]
10000 loops, best of 3: 118 us per loop

timeit a = [f(n) for n in range(len(mlist))]
10000 loops, best of 3: 102 us per loop

et juste pour le plaisir en utilisant xrange() (Python v2.7.2)

timeit a = [f(n) for n in xrange(len(mlist))]
10000 loops, best of 3: 99 us per loop

je serais favorable à un code lisible première , puis à l'aide de xrange() si disponible (c'est à dire, Pré-v Python 3.x), suivi de range() et enumerate() .

19
répondu Levon 2016-10-27 10:58:53

la solution de la gamme (x)est plus rapide, parce qu'elle a moins de frais généraux, donc je l'utiliserais.

En Python 2.x, utilisez xrange au lieu de range , parce que xrange utilise moins de mémoire, parce qu'il ne crée pas de liste temporaire. En Python 3.x , il n'y a que range , qui est la version Moins mémoire.

5
répondu pts 2012-08-16 15:05:29

si vous utilisez Python 2.x, si vous utilisez len() , vous devez utiliser xrange() car il évitera de créer une liste des nombres dans la gamme.

et dans ce cas, je dirais len() parce que vous utilisez les indices, pas les éléments de la liste.

1
répondu kindall 2012-08-16 15:07:00

je dirais que comme vous n'utilisez pas l'attribut " _ " de la fonction enumarate, alors utilisez range car il est plus lisible de cette façon.

0
répondu Ctrlspc 2012-08-16 15:06:45