Consommation de mémoire Python: dict VS liste de tuples

Il y a beaucoup de questions et de discussion à propos de la consommation de mémoire des différents python les types de données. Pourtant, peu d'entre eux (le cas échéant) d'arriver à un scénario très spécifique. Lorsque vous souhaitez stocker BEAUCOUP de données clé-valeur dans la mémoire, des données dont la structure est plus efficace de la mémoire, une dict ou une liste de tuples?

Au début je pensais que dict est plus puissant que la liste de tuples et que le pouvoir doit venir avec un certain prix, et en fait un vide dict NE s'occupent plus de mémoire qu'une liste vide ou n-uplet (voir En mémoire de la taille d'un Python de la structure), donc j'ai pensé à l'aide de [(key1, value1), (key2, value2), ...] serait plus efficace de la mémoire que {key1: value1, key2: value2, ...}.

Semble que j'ai été mauvais. Lancez simplement l'extrait de code suivant, et de voir le mem consommation rapporté par votre système d'exploitation. Je suis avec Windows XP ainsi que le gestionnaire des tâches m'indique, un grand dict mange "seulement" 40 MO de Ram et 40 mo VIRTURAL de Ram, mais une liste de tuples mange jusqu'à 60 mo de Ram et 60 MO ram Virtuelle.

Comment pourrait-ce être?

from sys import getsizeof as g
raw_input('ready, press ENTER')
i = 1000000
#p = [(x, x) for x in xrange(i)] # Will print 4,348,736 40,348,736
p = dict((x, x) for x in xrange(i)) # Will print 25,165,964 37,165,964
print g(p), g(p) + sum(g(x) for x in p)
raw_input("Check your process's memory consumption now, press ENTER to exit")

Mise à jour:

Merci pour les quelques commentaires ci-dessous. Je veux préciser: je parle de la mémoire de l'efficacité. Et non, dans ce cas, pas besoin de vous inquiéter de la valeur-clé de recherche d'efficacité, nous allons simplement supposer que mon algorithme va consommer un par un via un itérateur.

source d'informationauteur RayLuo | 2013-03-26