Python中合并和删除重复ID的最快方法

Python中合并和删除重复ID的最快方法,python,django,python-3.x,numpy,Python,Django,Python 3.x,Numpy,我有两个不同的查询集,我需要合并在一起,然后删除任何重复的ID。有超过一百万张唱片 list_a = Wharehouse.orders.all().values_list('id', flat=True) list_b = Shops.orders.all().values_list('id', flat=True) 有没有一种快速的蟒蛇式的方法 我可以考虑使用列表理解并循环每个值。但是,这可以在numpy中更好/更快地完成,或者可能是一套?输出只需要是一个ID列表 我正在使用安装了NUMP

我有两个不同的查询集,我需要合并在一起,然后删除任何重复的ID。有超过一百万张唱片

list_a = Wharehouse.orders.all().values_list('id', flat=True)
list_b = Shops.orders.all().values_list('id', flat=True)
有没有一种快速的蟒蛇式的方法

我可以考虑使用列表理解并循环每个值。但是,这可以在numpy中更好/更快地完成,或者可能是一套?输出只需要是一个ID列表


我正在使用安装了NUMPY1.11.0 pip的Python3.4和Django

尝试将其强制转换为
以删除重复项。然后可以将其返回到列表中。要连接列表,请使用
+
运算符。它可以做到这一点(至少对于普通列表)


尝试将其强制转换为
,以删除重复项。然后可以将其返回到列表中。要连接列表,请使用
+
运算符。它可以做到这一点(至少对于普通列表)

一种方法是使用

我们创建了两个集合
set_a
set_b
set_a
包含
Wharehouse
对象的所有ID
set_b
包含所有
shop
id。现在,为了组合所有唯一ID,我们对集合使用
union
操作<代码>最终设置包含所有所需的唯一ID

set_a = set(Wharehouse.orders.all().values_list('id', flat=True))
set_b = set(Shops.orders.all().values_list('id', flat=True))

final_set = set_a.union(set_b) # contains all unique ids combined 
一种方法是使用

我们创建了两个集合
set_a
set_b
set_a
包含
Wharehouse
对象的所有ID
set_b
包含所有
shop
id。现在,为了组合所有唯一ID,我们对集合使用
union
操作<代码>最终设置包含所有所需的唯一ID

set_a = set(Wharehouse.orders.all().values_list('id', flat=True))
set_b = set(Shops.orders.all().values_list('id', flat=True))

final_set = set_a.union(set_b) # contains all unique ids combined 
让DB来做这项工作


让DB来做这项工作。

假设
列表a
列表b
是整数列表,您可以使用
np.union1d(列表a,列表b)
。使用:

import numpy as np
N = 10**6
list_a = np.random.randint(2*10**6, size=N).tolist()
list_b = np.random.randint(2*10**6, size=N).tolist()

下面是一个基准,它建议在应用于包含大约一百万个元素的列表时可能会更快:

In [32]: %timeit np.union1d(list_a, list_b)
1 loop, best of 3: 296 ms per loop

In [40]: %timeit set(list_a + list_b)
1 loop, best of 3: 308 ms per loop

In [31]: %timeit set(list_a).union(list_b)
1 loop, best of 3: 338 ms per loop

In [33]: %timeit list(set(list_a + list_b))
1 loop, best of 3: 382 ms per loop

当然,请注意,
np.union1d
返回一个NumPy数组,而
set
list
返回同名类型的Python对象,因此基准在某种程度上是苹果对橙色的比较。

假设
列表a
列表b
是整数列表,您可以使用
np.union1d(列表a、列表b)
。使用:

import numpy as np
N = 10**6
list_a = np.random.randint(2*10**6, size=N).tolist()
list_b = np.random.randint(2*10**6, size=N).tolist()

下面是一个基准,它建议在应用于包含大约一百万个元素的列表时可能会更快:

In [32]: %timeit np.union1d(list_a, list_b)
1 loop, best of 3: 296 ms per loop

In [40]: %timeit set(list_a + list_b)
1 loop, best of 3: 308 ms per loop

In [31]: %timeit set(list_a).union(list_b)
1 loop, best of 3: 338 ms per loop

In [33]: %timeit list(set(list_a + list_b))
1 loop, best of 3: 382 ms per loop

当然,请注意,
np.union1d
返回一个NumPy数组,而
set
list
返回同名类型的Python对象,因此基准在某种程度上是一个苹果对橙色的比较。

谢谢Vogon Jeltz,一个set是个好主意,但是NumPy会更快吗?请注意,
ValuesListQuerySet
不会支持加法。您应该先将它们转换为列表或其他数据结构。@AshwiniChaudhary的“flat=True”不是简单的列表吗?它可能会快一点,但在列表为10000的计算机上,在我的计算机上操作最多需要20毫秒elements@Spaceships不,它仍然是一个queryset。谢谢你,Vogon Jeltz,一套是很好的选择dea,但是numpy会更快吗?请注意,
ValuesListQuerySet
不支持加法。您应该先将它们转换为列表或其他数据结构。@AshwiniChaudhary的“flat=True”不是简单的列表吗?它可能会快一点,但在列表为10000的计算机上,在我的计算机上操作需要20毫秒elements@S不,它仍然是一个查询集。尝试使用两种方法并对其计时。尝试使用两种方法并对其计时。但是您仍然需要一个操作来获得实际的联合,即
结果
不是这里的实际结果。另外,根据数据库的不同,在
中使用另一个查询集实际上可能会很慢。您应该将
shops\u查询的结果
转换为
列表()
首先将其传递到下一个查询,将其简化为一个查询
商店的ID
。但是您仍然需要一个操作来获取实际的联合,即
结果
不是此处的实际结果。另外,根据数据库的不同,在
中使用另一个查询集实际上可能会很慢。您应该转换首先将
shops\u query
的结果传递到
列表()
,然后再将其传递到下一个查询,以将其减少为
shops\u query
的ID的单个查询。