假设我已经分析了我的程序,并且绝大部分的运行时都花在了“list”对象的方法'remove‘上。程序操作集合集合,不需要对集合进行排序。在python中实现这些集合的最简单的方法是什么(最好使用标准python集合),以便collection.remove( item )在集合是外部集合和item是内部集合时以及当集合是内部集合和item只是不可变的对象时都是廉价的。
这里使用集合的问题是,集合不能包含可变集合,因此内部集合必须是冻结集合,但是移除项不再那么便宜了。
到目前为止,我找到的最好的解决方案是有人提出的答案,这个答案显然是在不久之后被删除的。他们建议用小弟弟。这是可行的,但是您必须为每个项目生成任意的id,所以这有点尴尬。另一种选择是使用链接列表,但这也会很尴尬,因为链接列表不是标准库的一部分。
发布于 2010-11-08 07:50:42
如果您可以使用定义为identity的相等状态,则可以创建一个hashable子类型,并将它们作为set成员用于快速访问/删除:
class hlist(list):
"Hashable list"
def __hash__(self):
return id(self)
def __eq__(self, other):
return self is other
def __ne__{self, other}:
return self is not other
in1 = hlist([1,2,3])
in2 = hlist([4,5,6])
outer = set([in1, in2])发布于 2010-11-08 03:27:06
,他们建议使用一个丁字。这是可行的,但是您必须为每个项目生成任意的id,所以这有点尴尬。
你把它们按实例删除了?使用dict方法,您总是可以使用id()作为它们的“任意”ID?
一个用于组的dict,其id()为键,内部dict为invidual的id()。以及另一个以个人id()为关键的全球id()。
还不清楚一个人是否可以在多个群体中.如果是这样的话,您需要在删除它之前验证invidual是否在任何组中。
发布于 2010-11-08 04:15:50
在本例中,字典是您想要的集合,因为它有O(1)、查找和删除。当您想要添加/删除时,将需要为每个对象生成一个键,但这比扫描列表的O(n)方法要快得多。在这种情况下,为对象生成一个键是正确的。如果您有主键(它们来自DB吗?)这将否定对属性查找的哈希函数,您将获得近乎完美的性能。
在这种情况下,您似乎认为使用字典作为数据结构是一件坏事--根本不是。字典的目的是快速查找集合中的项目。这就是你需要的,用它。
https://stackoverflow.com/questions/4119698
复制相似问题