Je dois stocker une grande liste de nombres en mémoire. Je devrai ensuite vérifier l'appartenance à un groupe. Les tableaux sont meilleurs que les listes pour l'efficacité de la mémoire. Les ensembles sont meilleurs que les listes pour la vérification de l'appartenance. J'ai besoin des deux ! Mes questions sont donc les suivantes :
1) Dans quelle mesure les tableaux sont-ils plus efficaces en termes de mémoire que les ensembles ? (Pour l'inverse, voir mes résultats ci-dessous). 2) Existe-t-il une structure de données qui offre un meilleur équilibre entre les ensembles et les tableaux ? Quelque chose comme un ensemble avec un type entier signé ? Ou une construction numpy ?
J'ai vérifié la différence de temps d'adhésion avec le script ci-dessous. (Je sais que timeit est meilleur, mais la variance est suffisamment faible pour que time soit correct) :
import array
import time
class TimerContext:
def __enter__(self):
self.t0 = time.time()
def __exit__(self, *args, **kwargs):
print(time.time()-self.t0)
SIZE = 1000000
l = list([i for i in range(SIZE)])
a = array.array('I', l)
s = set(l)
print(type(l))
print(type(a))
print(type(s))
with TimerContext():
x = 99999 in l
with TimerContext():
x = 99999 in a
with TimerContext():
x = 99999 in s
Résultats :
<class 'list'>
<class 'array.array'>
<class 'set'>
0.0012176036834716797
0.0024595260620117188
1.430511474609375e-06
Les ensembles sont donc BEAUCOUP plus rapides pour la vérification de l'appartenance (veuillez noter la notation scientifique). Donc, si leur empreinte mémoire n'est pas si différente de celle d'un tableau, je préférerai utiliser un ensemble. Mais je ne sais pas comment vérifier l'empreinte mémoire.
Je dois également ajouter qu'il y a beaucoup de questions comparant les ensembles et les listes. Mais je n'ai pas vu de bonnes réponses comparant les tableaux et les ensembles.