我正在编程某种模拟,其数据在树中组织。主要对象是World
,它包含一堆方法和一个City
对象列表。每个City
对象依次有一堆方法和一个Population
对象列表。 Population
个对象没有自己的方法,只有属性。
我的问题是关于后面的Population
个对象,我可以从object
派生或创建为词典。组织这些的最有效方法是什么?
以下几个案例说明了我的犹豫:
保存数据
我需要能够保存并加载模拟,为此我使用built-in json(我希望数据是人类可读的)。由于程序是在树中组织的,因此在每个级别保存数据可能很麻烦。在这种情况下,群体最好保存为附加到population
列表的字典作为City
实例的属性。这样,保存只是将City
实例的__dict__
传递给Json。
使用数据
如果我想操纵填充数据,它作为类实例比作为字典更容易。不仅语法简单,而且我还可以在编码时更好地享受内省特征。
性能
最后,我不确定资源方面的效率最高。对象和字典最终差别不大,因为每个对象都有__dict__
属性,可用于访问其所有属性。如果我使用大量City
和Population
对象运行模拟,那么将使用较少的资源:对象或词典?
再说一次,在树中组织数据的最有效方法是什么?字典或对象更受欢迎吗?或者组织数据树有什么秘密吗?
答案 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更快。