【发布时间】:2013-09-20 16:27:55
【问题描述】:
我正在寻求一些帮助来理解 Python 中大型列表、字典或数组的性能特征。我有大约 100 万个键值对需要临时存储(明年可能会增长到 1000 万个)。它们的键是数据库 ID,范围从 0 到大约 1.1M(有一些间隙),值是浮点数。
我正在计算pagerank,所以我的过程是把每个ID初始化为1,然后在内存中查找并更新大约十次,然后再将其保存回数据库。
我推测如果我使用数据库 ID 作为数组/列表的索引,列表或数组将是最快的。这将创建一个 gappy 数据结构,但我不明白查找或更新的速度有多快。我也不明白使用
arrays代替列表是否有很大的好处。为此使用 dict 非常自然,具有键值对,但我的印象是,第一次构建 dict 会非常缓慢且内存密集,因为它会增长以容纳所有条目。
我还读到 SQLite 可能是使用
:memory:标志的一个很好的解决方案,但我还没有深入研究。
无论如何,只是在这里寻找一些指导。在我深入研究时,任何想法都将不胜感激。
【问题讨论】:
-
如果您想操作包含数百万个条目的数组,请考虑使用
numpy。至少它将使用大约 2-3 倍的内存,如果幸运的话,您可以对操作进行矢量化,从而获得 巨大 的速度提升。但是,您应该能够使用普通计算机在dict中处理 1000 万个键/值对。创建一个大的dict确实需要时间,但它是线性时间操作,因此不会花费大量时间。在我的机器上,构建一个 1000 万条目dict需要 1.88 秒。它使用大约 700MB 的 RAM。 -
一个简单的提示:如果您以逐个元素的方式使用
numpy,那么您可能会看到应用程序的减速,因为numpy必须每次执行本机数据类型到 python 对象之间的转换,所以当你做array[index]时会创建一个新对象等。这对于array模块中的数组也是如此,所以你应该非常小心并且做在决定之前对您的应用程序进行一些真实的分析。
标签: python arrays performance sqlite data-structures