Python中合并和删除重复ID的最快方法
我有两个不同的查询集,我需要合并在一起,然后删除任何重复的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
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
对象的所有IDset_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
对象的所有IDset_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的单个查询。