我有两个列表:
- old_data的长度为180000
- updated_data的长度为184000
- 这两个列表都包含字符串值的ID
- 存储在列表中的ID有很多重叠,但我需要知道哪些ID不再存储在updated_data中,这样我就可以说这些ID在SQL server中不再活动
因此,我需要检查old_data中不在updated_data的任何项目,并将它们保存到一个单独的列表中,我们称之为inactive_data。
我目前有以下代码,这是非常耗时和低效的:
# Initialize list for no-longer active IDs to be saved into.
inactive_data = []
# Iteratively check if all IDs in old data are still in updated data.
# If they are not, add them to the list.
for Id in old_data:
if Id not in updated_data:
inactive_data.append(Id)
要运行此代码,大约需要45分钟。我想知道怎样才能大大减少时间。如果你有什么建议,请告诉我!
通常简单的方法是将一个或两个list
转换为set
。
另一种方法是对两个列表进行排序,并逐元素进行比较。一旦它们被排序,比较就很快,因为它是O(n(。
诀窍是使用set((、sortedcontainers,然后使用set操作来进行diff。如果您的数据集更复杂,您可能需要使用dict对id进行索引,然后使用一组键。
# from sortedcontainers import SortedSet, SortedDict
old_data = set(map(str,range(180000)))
updated_data = set(map(str,range(184000)))
inactive_data = updated_data - old_data
active_data = updated_data & old_data
print("inactive_data: ", len(inactive_data), set(list(inactive_data)[0:10]))
print("active_data: ", len(active_data), set(list(active_data)[0:10]))
inactive_data: 4000 {'181439', '181023', '183834', '180575', '182003', '183226', '180134', '183697', '181968', '181804'}
active_data: 180000 {'54276', '128822', '91802', '8678', '118826', '97510', '22786', '30341', '88711', '137764'}
time 0.609s
- 注意:已排序的容器。SortedSet的速度是无序集((的一半