【问题标题】:Maintaining indexes on lists维护列表的索引
【发布时间】:2012-05-07 11:27:55
【问题描述】:

我应该如何实现对集合中项目的快速查找?

class Person(object):
    __all__ = dict()

    def __init__(self, _id, name, age):
        self._id = _id
        self.name = name
        self.age = age
        self.__class__.__all__[_id] = self

假设我希望得到五个最年长的人。如果len(Person.__all__) 很大,而且我需要经常执行此操作,那么最佳做法是什么?目前我的代码运行大约需要 4 小时,我什至还没有输入整个数据集。

我目前的想法是我可以使用数据库来维护索引,但我的感觉是这会比将所有对象都保存在 ram 中要慢。 (我可以轻松地将每个对象放入 ram 中)。

或者,我可以在 Python 中拥有某种基于自动排序列表的索引。所以,当我需要查找某个年龄的人时,我会查询该列表,查找 ID,然后使用 Person.__all__ 获取对象本身。

最好的选择是什么?

【问题讨论】:

  • 四个小时?您的数据库中必须有 很多 人……说真的,向我们展示您的代码。
  • 使用数据库即可。 (SELECT * FROM people ORDER BY age DESC LIMIT 5)
  • 我很确定__*__ 是保留的,如果您想创建私有财产,请使用__all
  • all 后面的双下划线是什么意思?
  • @gnibbler __*__ 方法和属性用于类成本化、覆盖运算符等。__* 是私有属性,解释器重命名这些属性,因此您的代码无法直接.

标签: python database sorting indexing python-2.7


【解决方案1】:

您可以使用 sqlite 创建内存数据库。如果您需要,以后可以很容易地将数据库移动到磁盘

【讨论】:

    【解决方案2】:

    字典是哈希表的 Python 版本,它保证(平均而言)快速查找。它确实保证快速“找到最少的k个元素”——事实上,这会很慢,因为你需要查看字典中的每个人。

    相反,您希望将人员存储在 排序 数据结构中,从那时起,您只需查看前(或可能是最后)五个条目即可找到最年长的人。

    Python 没有这样的内置数据结构,但是有一个使用良好且经过良好测试的包blist,它提供了sorteddict。您想使用其中之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      相关资源
      最近更新 更多