【问题标题】:Fastest Get Python Data Structures最快获取 Python 数据结构
【发布时间】:2013-04-23 19:26:58
【问题描述】:

我正在开发 AI 来执行 MDP,我正在获取状态(在这种情况下只是整数)并为其分配一个值,我将经常这样做。因此,我正在寻找一种可以保存(无需删除)该信息并且具有非常快速的获取/更新功能的数据结构。有没有比普通字典更快的东西?我正在寻找任何真正如此原生的 python、开源的东西,我只需要快速获取。

【问题讨论】:

  • 很难击败像 Python 中那样实现良好的哈希表,但是如果您的整数键是密集的,那么列表可能比字典稍快(即使两者都是 O(1 ) 反正)。但是,您遇到的任何性能瓶颈不太可能是由于使用字典造成的。
  • 是的,这听起来像是过早的优化。
  • @Easily:如果需要,切换底层数据结构将非常容易,您为什么认为这会“巩固”任何东西?
  • 是的,如果您真的担心这可能导致重构,只需创建某种隐藏实现的包装类;这样,您可以很容易地更改该类,而无需更改任何其他代码。
  • 附带说明,如果您确实找到了比 python 字典快得多的解决方案,我建议您告诉 python 人员,以便他们将其合并到 python 中。

标签: python performance data-structures artificial-intelligence


【解决方案1】:

使用 Python 字典是可行的方法。

【讨论】:

  • 你为什么认为 Python 中存在更有效的方法?基本字典类型已经过非常好的优化。
  • 我来自 java 和一些教得很差的 cs 课程,所以我本能地认为有人做得更好。
  • @Easily:您是否真正尝试过它是否足够快满足您的目的?
  • 哈哈哈!这是最好的答案。不过说真的,Python 字典的实现相当不错。
【解决方案2】:

你是说你所有的键都是整数?在这种情况下,使用列表可能会更快,只需将列表索引视为键值。但是,您必须确保从不删除或添加列表项;只需从您认为需要的数量开始,将它们全部设置为等于None,如图所示:

mylist = [None for i in xrange(totalitems)]

那么,当你需要“添加”一个项目时,只需设置相应的值即可。

请注意,就实际效率而言,这实际上可能不会给您带来太多好处,而且可能比仅使用字典更令人困惑。

对于 10,000 个项目,事实证明(在我的机器上,使用我的特定测试用例)访问每个项目并将其分配给一个变量大约需要 334.8 秒(使用列表)和 565 秒(使用字典)。

【讨论】:

  • 你也可以[None]*totalitems
  • ^这是真的。它似乎也稍微快了一点,尽管对于不到一千万个项目来说,两者实际上都是瞬时的。
  • 更重要的是,[None] * n 是一种广泛使用的 Python idiom,用于创建列表,因此比列表推导式更具可读性。 (此外,列表推导式有额外的方括号,使其语法无效。)
  • 那是我的一个误判——我把它放在括号里是因为我想表明它应该替换为实际的项目数。但我现在意识到,如果我不考虑它们会更清楚。
  • 将 10,000 个元素分配给 any 数据结构非常慢,您不是说吗?
【解决方案3】:

如果您想要快速原型,请使用 python。而且不用担心速度。

如果你想编写快速的科学代码(并且你不能在快速的本地库上构建,比如用于线性代数的 LAPACK)用 C、C++ 编写它(也许只能从 Python 调用)。如果快速而不是超快就足够了,您还可以使用 Java 或 Scala。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 2019-06-02
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多