【问题标题】:Improving Python Comparison and Existence Operations改进 Python 比较和存在操作
【发布时间】:2011-06-07 14:20:38
【问题描述】:

我对 Python 还很陌生,希望在继续之前能得到一些建议。我有一组整数,我想尽快检查给定元素是否包含在该组中(速度在这里很重要)。

对于 Python,我应该查看为这些操作(BST 等)量身定制的自定义数据结构,还是使用 any() 包装之类的 Python 技巧,或者是否有任何众所周知的 Python/C 库是此类标准的标准?事物。我不想在这里重新发明轮子,所以我很想听听在 Python 中处理这个问题的常用方法。

多一点背景,元素都预先插入到组中,之后就没有了,所以插入时间无关紧要。这似乎意味着维护一个排序组并执行诸如二进制搜索之类的操作将是最好的方法,但我确信这已经实现了比我可以实现的效率更高,并且可以在 Python/C 库中使用。有兴趣听听你们的想法。

谢谢!

【问题讨论】:

  • 存在就是你所需要的吗?你的团队有多大?如果设置/插入时间无关紧要,“x in a”(其中 x 是整数,a 是集合)已经非常快了。

标签: python c performance comparison binary-search


【解决方案1】:

正如 DMS 在评论中所说,有一个内置的 set(和不可变的变体 frozenset,它非常有用,您不需要变异,并且可以将值的生成放入单个生成器表达式)。它是基于哈希的,因此牺牲了摊销 O(1) 成员资格测试的顺序。它是用 C 语言编写的,并且花费更多的时间使它变得更快,而不是你可以合理地花费在它上面。如果内存正常,它是基于字典实现的,它可能在现有的 fastet 哈希表(常用)中。

请注意,“散列”部分也将是 O(1),因为整数会自行散列。这些算法专为很好地处理“非随机”(例如,有些连续的)哈希而设计。

【讨论】:

    【解决方案2】:

    最 Pythonic 的方式是不将它们存储在排序容器中,而是使用 set(或不可变变体 frozenset)。这些是基于散列的容器,所以查找是 O(1)。更重要的是,散列算法是 Python 中的核心操作之一(用于字典和属性查找),所以它是用 C 编写的,并且写得很快。

    Python 通常就是这种情况。使用标准容器将比在 Python 级别滚动您自己的容器更快,因此请尽量使用它们。

    如果您确实想将它们存储在排序列表中,请查看标准库中的 bisect 模块。它具有二进制搜索的标准功能。 (好吧,实际上不是。我实际上返回了搜索项目所在位置的索引。您必须自己进行最终比较。)它可能会在 C 中实现它们(取决于您的配置),所以它会比你自己写的要快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      相关资源
      最近更新 更多