【问题标题】:Performance of Large Data Structures in PythonPython 中大型数据结构的性能
【发布时间】:2013-09-20 16:27:55
【问题描述】:

我正在寻求一些帮助来理解 Python 中大型列表、字典或数组的性能特征。我有大约 100 万个键值对需要临时存储(明年可能会增长到 1000 万个)。它们的键是数据库 ID,范围从 0 到大约 1.1M(有一些间隙),值是浮点数。

我正在计算pagerank,所以我的过程是把每个ID初始化为1,然后在内存中查找并更新大约十次,然后再将其保存回数据库。

  1. 我推测如果我使用数据库 ID 作为数组/列表的索引,列表或数组将是最快的。这将创建一个 gappy 数据结构,但我不明白查找或更新的速度有多快。我也不明白使用arrays 代替列表是否有很大的好处。

  2. 为此使用 dict 非常自然,具有键值对,但我的印象是,第一次构建 dict 会非常缓慢且内存密集,因为它会增长以容纳所有条目。

  3. 我还读到 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


【解决方案1】:

从字典开始。 Even if you are running on WinXP 1000 万个密钥应该不是问题。但我希望你不是:)

字典将更容易编码,并且可能更快地构建和更新,尤其是在您以随机顺序更新值的情况下。

通常最好开始编写原型并使用它来识别性能问题。您的瓶颈很可能在您请求数据的任何地方。不输入或从字典中检索它。

【讨论】:

    【解决方案2】:

    由于内置的​​键 hashing,在字典中查找数据需要 O(1) 时间。当然,对于大量数据,collisions 将需要线性时间来解决,但是具有 10M 项的 dicts 应该可以正常工作。不要在长列表中搜索数据,因为这将花费线性 (O(n)) 时间。

    但是,请考虑使用 numpy,具体取决于您打算如何处理数据。仅用于存储和检索,dicts 是完美的,但是使用 numpy 的vectorization instead of using loops 可以大大加快海量数据的计算速度。

    当您需要执行更复杂的查询(搜索多个键或定义要匹配的条件)时,就会出现 SQL。对于一个简单的键值对,SQL 似乎有点过头了。

    【讨论】:

      【解决方案3】:

      嗯,一般来说,如果你有太多的数据要保存在内存中,你需要使用某种外部存储;如果你所有的数据都适合内存,你不需要做任何花哨的事情。

      您可能遇到的最大问题是,如果您拥有的数据多于操作系统在单个进程映像中所允许的数据;在这种情况下,您将需要外部存储。

      在这两种情况下,这归结为:使用数据库,无论是否使用 sql。如果是 sql 数据库,您可能希望使用 ORM 来简化操作。

      但是,在遇到此问题之前,只需将所有内容存储在内存中,然后序列化到磁盘。我建议使用cPickle 或 ORM+sqlite。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-15
        • 1970-01-01
        • 1970-01-01
        • 2021-01-05
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多