In [34]: list1 = [Foo(1,'a'),Foo(1,'b'),Foo(2,'b'),Foo(3,'c')]*10000
In [35]: list2 = [Foo(1,'a'),Foo(2,'c'),Foo(2,'b'),Foo(4,'c')]*10000
In [40]: %timeit set1 = set((x.id,x.name) for x in list1); [x for x in list2 if (x.id,x.name) not in set1 ]
100 loops, best of 3: 15.3 ms per loop
In [41]: %timeit set1 = set(list1); [x for x in list2 if x not in set1]
10 loops, best of 3: 33.2 ms per loop
您可以使用
filter
在Python 2中,它将返回所需的列表。在Python 3中,它将返回一个
filter
对象,您可能希望将其转换为列表。只是一个想法。。。
所以通常这是行不通的:
但是你可以教
Foo
两个实例相等意味着什么:现在:
当然,更可能的是,您可以在类定义时在
__hash__
上定义__eq__
和Foo
,而无需稍后对其进行猴子修补:为了满足我自己的好奇心,这里有一个基准:
因此@mgilson的方法更快,尽管在
Foo
中定义__hash__
和__eq__
会导致更可读的代码。我可能会这样做:
其中
...
是实例的附加(哈希)属性——您需要包含足够多的属性以使其唯一。这将使用O(N*M)算法并将其转换为O(max(N,M))算法。
我可能会这样做:
其中
...
是实例的附加(散列)属性——您需要包含足够多的属性以使其唯一。这将使用O(N*M)算法并将其转换为O(max(N,M))算法。
相关问题 更多 >
编程相关推荐