web-dev-qa-db-fra.com

Le moyen le plus rapide de rechercher une liste dans python

Lorsque vous faites quelque chose comme "test" in aa est une liste python fait une recherche séquentielle sur la liste ou crée-t-il une représentation de table de hachage pour optimiser la Dans l'application dont j'ai besoin, car je ferai beaucoup de recherches sur la liste, alors serait-il préférable de faire quelque chose comme b = set(a) puis "test" in b? Notez également que le la liste des valeurs que j'aurai n'aura pas de données en double et je ne me soucie pas vraiment de l'ordre dans lequel elles se trouvent; j'ai juste besoin de pouvoir vérifier l'existence d'une valeur.

27
Ian Burris

Notez également que la liste de valeurs que j'aurai n'aura pas de données en double et je ne me soucie pas vraiment de l'ordre dans lequel elles se trouvent; J'ai juste besoin de pouvoir vérifier l'existence d'une valeur.

N'utilisez pas de liste, utilisez plutôt set() . Il a exactement les propriétés souhaitées, y compris un test in ultra rapide.

J'ai vu des accélérations de 20x et plus dans des endroits (principalement des calculs de nombres importants) où une liste a été modifiée pour un ensemble.

55
orlp

"test" in a avec une liste a fera une recherche linéaire. Mettre en place une table de hachage à la volée serait beaucoup plus cher qu'une recherche linéaire. "test" in b d'autre part fera une recherche de hachage O(1) amoirtised).

Dans le cas que vous décrivez, il ne semble pas y avoir de raison d'utiliser une liste sur un ensemble.

8
Sven Marnach

Je pense qu'il serait préférable d'aller avec la mise en œuvre définie. Je sais pertinemment que les ensembles ont O(1) temps de recherche. Je pense que les listes prennent O(n) temps de recherche. Mais même si les listes sont également O(1) recherche, vous ne perdez rien en passant aux ensembles.

De plus, les ensembles n'autorisent pas les valeurs en double. Cela rendra également votre programme légèrement plus efficace en mémoire

1
inspectorG4dget

La liste et les tuples semblent avoir le même temps, et l'utilisation de "in" est lente pour les grandes données:

>>> t = list(range(0, 1000000))
>>> a=time.time();x = [b in t for b in range(100234,101234)];print(time.time()-a)
1.66235494614
>>> t = Tuple(range(0, 1000000))
>>> a=time.time();x = [b in t for b in range(100234,101234)];print(time.time()-a)
1.6594209671

Voici une bien meilleure solution: Le moyen le plus efficace pour une recherche/recherche dans une énorme liste (python)

C'est super rapide:

>>> from bisect import bisect_left
>>> t = list(range(0, 1000000))
>>> a=time.time();x = [t[bisect_left(t,b)]==b for b in range(100234,101234)];print(time.time()-a)
0.0054759979248
0
Grzegorz Świerad