对象与字典:如何组织数据树?

时间:2011-06-18 16:10:24

标签: python object resources dictionary tree

我正在编程某种模拟,其数据在树中组织。主要对象是World,它包含一堆方法和一个City对象列表。每个City对象依次有一堆方法和一个Population对象列表。 Population个对象没有自己的方法,只有属性。

我的问题是关于后面的Population个对象,我可以从object派生或创建为词典。组织这些的最有效方法是什么?

以下几个案例说明了我的犹豫:

保存数据
我需要能够保存并加载模拟,为此我使用built-in json(我希望数据是人类可读的)。由于程序是在树中组织的,因此在每个级别保存数据可能很麻烦。在这种情况下,群体最好保存为附加到population列表的字典作为City实例的属性。这样,保存只是将City实例的__dict__传递给Json。

使用数据
如果我想操纵填充数据,它作为类实例比作为字典更容易。不仅语法简单,而且我还可以在编码时更好地享受内省特征。

性能
最后,我不确定资源方面的效率最高。对象和字典最终差别不大,因为每个对象都有__dict__属性,可用于访问其所有属性。如果我使用大量CityPopulation对象运行模拟,那么将使用较少的资源:对象或词典?

再说一次,在树中组织数据的最有效方法是什么?字典或对象更受欢迎吗?或者组织数据树有什么秘密吗?

4 个答案:

答案 0 :(得分:2)

正如你自己所看到的,几乎没有什么实际差别 - 在我看来,主要区别在于使用单独的硬编码属性对于对象(不需要引用名称)稍微容易一些,而dicts很容易允许将所有值视为一个集合(例如将它们相加)。这就是为什么我会选择对象,因为人口对象的数据可能是异质的并且相对独立。

答案 1 :(得分:2)

为什么不是混合dict / object

class Population(dict):
    def __getattr__(self, key):
        return self[key]
    def __setattr__(self, key, value):
        self[key] = value

现在,您可以通过属性(foo.bar)轻松访问已知名称,同时仍具有dict功能,可以轻松访问未知名称,迭代它们等,而不会使用笨重的getattr / setattr语法。

如果您希望始终使用特定字段对其进行初始化,则可以添加__init__方法:

def __init__(self, starting=0, birthrate=100, imrate=10, emrate=10, deathrate=100):
     self.update(n=starting, b=birthrate, i=imrate, e=emrate, d=deathrate)

答案 2 :(得分:2)

我认为您应该考虑使用namedtuple(请参阅collections模块上的Python docs)。您可以像使用普通类一样访问Population对象的属性,例如字典population.attribute_name代替population['attribute_name']。由于您没有在Population课程上添加任何方法,这就是您所需要的。

对于“保存数据”标准,还有一个_asdict方法,它将字段名称字典返回给您可以传递给json的值。 (根据你使用的Python版本,你可能需要注意从这个方法中得到的确切内容。有些版本返回一个字典,有些版本返回OrderedDict。这可能没有任何区别。你的目的。)

namedtuples也非常轻量级,因此它们也适用于“运行模拟”资源要求。但是,我会回应别人的谨慎态度,说不要担心,除非你做一些严肃的数据处理,否则差别很小。

答案 3 :(得分:1)

我会说,在每种情况下,人口都是城市的成员,如果只是数据,为什么不使用字典?

不要担心性能,但如果你真的需要知道我认为dict更快。