【发布时间】:2013-03-16 12:01:02
【问题描述】:
有很多关于不同 python 数据类型的内存消耗的问题和讨论。然而,他们中很少有人(如果有的话)遇到非常具体的情况。当你想在内存中存储大量的键值数据时,哪种数据结构更节省内存,字典还是元组列表?
一开始我认为 dict 比元组列表更强大,而且这种能力必须付出一些代价,实际上空 dict 确实比空列表或元组占用更多内存(请参阅In-memory size of a Python structure),所以我想使用[(key1, value1), (key2, value2), ...] 会比 {key1: value1, key2: value2, ...} 更节省内存。
看来我错了。只需启动以下代码 sn-p,然后查看您的操作系统报告的内存消耗。我正在使用 Windows XP,因此任务管理器告诉我,一个大字典“只”吃掉了 40MB 内存和 40MB 虚拟内存,但元组列表吃掉了 60MB 内存和 60MB 虚拟内存。
怎么可能?
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")
更新:
感谢下面的一些 cmets。我想澄清一下:我说的是内存效率。不,在这种情况下无需担心键值查找效率,让我们假设我的算法将通过迭代器一一消耗它们。
【问题讨论】:
-
你问错问题了。如果您需要键值查找,请使用 dict。如果您需要一个数组,请使用列表或元组。
-
Python 为字典保留一个哈希表。 This link 来自 another answer 我认为,字典的查找速度更快,并且元组使用的内存更少。
-
对于某些类型的数据,您可以使用比您的两个选项更优化的数据,例如 trie。
-
对什么有效?为了有效地使用内存或进行快速查找?
标签: python list dictionary memory tuples