什么类型的可变对象集合允许我快速删除python中的项?

什么类型的可变对象集合允许我快速删除python中的项?,python,optimization,linked-list,set,Python,Optimization,Linked List,Set,假设我已经分析了我的程序,并且运行时的绝大多数时间都花在“list”对象的方法“remove”上。程序操作集合集合,集合不需要排序。在python中实现这些集合(最好使用标准python集合)的最直接的方法是什么?这样,当collection是外部集合且item是内部集合时,以及当collection是内部集合且item只是不可变对象时,collection.remove(item)都是廉价的 在这里使用集合的问题是集合不能包含可变集合,因此内部集合必须是冻结集合,但是删除项就不再那么便宜了 到

假设我已经分析了我的程序,并且运行时的绝大多数时间都花在“list”对象的方法“remove”上。程序操作集合集合,集合不需要排序。在python中实现这些集合(最好使用标准python集合)的最直接的方法是什么?这样,当collection是外部集合且item是内部集合时,以及当collection是内部集合且item只是不可变对象时,collection.remove(item)都是廉价的

在这里使用集合的问题是集合不能包含可变集合,因此内部集合必须是冻结集合,但是删除项就不再那么便宜了


到目前为止,我遇到的最好的解决方案是有人在这里提出的一个答案,显然不久之后就被删除了。他们建议使用dict。这会起作用,但你必须为每个项目生成任意id,所以这有点尴尬。另一种选择是使用链表,但这也会很尴尬,因为链表不是标准库的一部分。

这可能并不完全符合您的要求,但可能满足您的一些要求:

deque支持线程安全、内存高效的附加和弹出,在deque的任意一侧,在任意方向上的O(1)性能大致相同


如果你花了大量的时间<代码>从清单中删除/>代码> ING元素,也许你应该考虑过滤它呢?换句话说。创建一个大的初始列表,然后创建使用列表中元素的后续生成器。

为什么不创建一个类似于
集合的主
列表
,然后再创建一个集合,其中包含要跟踪的集合的列表索引?当然,这可能需要一些额外的工作,但您应该能够将其抽象成一个类

他们建议使用dict。这会起作用,但你必须为每个项目生成任意id,所以这有点尴尬

您是否按实例删除它们?使用
dict
方法,您可以始终使用
id()
作为他们的“任意”id

一个
dict
用于以其
id()
为键的组,一个内部
dict
用于invidual的
id()
。还有另一个全局
dict
,其中个人的
id()作为键


不清楚一个人是否可以分为多个组。。。如果是这样,在删除invidual之前,您需要验证它是否在任何组中。

在本例中,Dictionary是您想要的集合,因为它具有O(1)find and delete。这会带来成本,即当您想要添加/删除每个对象时,为每个对象生成一个键,但这将比扫描列表的O(n)方法快得多。在这种情况下,为对象生成密钥是正确的。如果您有一个主键(它们是否来自DB?),它将对属性查找的哈希函数求反,您将获得近乎完美的性能


在这种情况下,您似乎认为使用字典作为数据结构是一件坏事——事实并非如此。字典的用途是快速查找集合中的项目。这就是您所需要的,请使用它。

如果您可以使用定义为标识的平等,您可以创建一个哈希列表子类型,并将其用作快速访问/删除的集合成员:

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])

当您进行
收集时。删除(项目)
该项目可能出现在多个子集合中,还是在单个集合中出现多次?无论如何,我怀疑操作的瓶颈将是搜索项目位置,以便您可以确定哪些子集合它所属的以及与之相关联的索引或键,以便继续删除。您是否可以更具体地说明您需要它做什么?我在一个社会遗传算法模拟中遇到了这个问题,其中有一个组集合,每个组都是一个个体的集合。个人经常从组中添加和删除,组经常从集合中添加和删除。这没有帮助。您仍在搜索每项删除的列表。OP还可以查看以了解有关词典内部的更多信息,以及为什么这是一个不错的选择。