1

使用 Python 2.6,内置 set(),而不是 sets.set。

我已经定义了一些自定义数据抽象类,它们将使用内置的 set() 对象成为某些集合的成员。

在被划分为集合之前,这些类已经被存储在一个单独的结构中。首先声明类的所有实例。声明第一个集合后,不会创建或删除任何类实例。没有两个类实例被认为彼此“相等”。(包含相同数据的类的两个实例被认为是不相同的。A == B 对于所有 A,B 都是 False,其中 B 不是 A。)

鉴于上述情况,这些测试策略之间会有任何合理的区别set_a == set_b吗?:

选项 1: 将整数存储在唯一标识我的类的实例的集合中。

选项 2: 存储我的类的实例,并实现__hash__()__eq__()比较 id(self) == id(other)。(这可能没有必要?这些函数的默认实现是否object只是做同样的事情但速度更快?)可能使用一个实例变量,每次新实例调用时递增__init__()。(不是线程安全的?)

或者,

选项 3: 实例已经存储并在由相当长的字符串键入的字典中查找。字符串是最直接代表实例的内容,并且保持唯一。__eq__()我认为将这些字符串存储在集合中会产生 RAM 开销和/或通过调用and来创建一堆额外的运行时__hash__()。如果不是这种情况,我应该直接存储字符串。(但我认为到目前为止我所读到的内容告诉我情况确实如此。)

我对 Python 中的集合有点陌生。我已经弄清楚了一些我需要知道的东西,只是想确保我没有忽略一些棘手的事情或在某处得出错误的结论。

4

1 回答 1

1

我可能误解了这个问题,但这就是 Python 默认的行为方式:

class Foo(object):
    pass

a = Foo()
b = Foo()
c = Foo()

x = set([a, b])
y = set([a, b])
z = set([a, c])

print x == y # True
print x == z # False

对象中这些函数的默认实现是否只是做同样的事情但速度更快?

是的。User-defined classes have __cmp__() and __hash__() methods by default; with them, all objects compare unequal (except with themselves) and x.__hash__() returns id(x). 文档

于 2012-09-25T08:02:24.880 回答