web-dev-qa-db-fra.com

gamme (len (liste)) ou énumérer (liste)?

Dupliquer possible:
Seul index nécessaire: énumérer ou (x) plage?

Lequel de ceux-ci serait considéré comme meilleur/plus clair/plus rapide/plus «pythonique»? Je me fous du contenu de la liste L, du temps qu’elle prend.

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

ou

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

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

18
Benjamin Hodgson

Quelques exécutions rapides semblent donner à la 2ème option en utilisant range() un léger avantage sur 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 préférerais d'abord le code lisible , puis en utilisant xrange() si disponible (c'est-à-dire, Pre-Python v 3.x), suivi de range() et enumerate().

21
Levon

La solution de plage (x) est plus rapide, car elle nécessite moins de temps système, donc je l’utiliserais.

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

5
pts

En supposant que vous utilisez Python 2.x, si vous utilisez len(), vous devez utiliser xrange() car cela évitera de créer une liste des nombres dans la plage.

Et dans ce cas, je choisirais len() car vous utilisez les index, pas les éléments de la liste.

1
kindall

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

0
Ctrlspc