我有一个存储在MySQL数据库中的200k列表。给定列表A,我需要计算A和200k列表的每个列表X之间的相似性得分。假设相似性度量是简单的,例如A和X的集合交集的长度。
鉴于成对比较的性质,我想不出为此改进O(N)的方法,因此改进运行时意味着使用多个CPU内核。现在我使用multithreading.Pool()将此任务拆分为4个核心,但仍需要将近10分钟才能完成。更糟糕的是,我的电脑关机以保护自己。
对于之前处理过此问题的人,您是否有另一种可以分享的方法?
答案 0 :(得分:0)
def bestmatch(A, lists):
a = set(A)
return min(lists, key=lambda x: len(set(x) & a)
使用 min 循环C速度。 lambda 是一个快速引用 a 的闭包。 set(A)
步只计算一次,而不是在内循环中计算。
答案 1 :(得分:0)
假设你的列表看起来像这样
LISTID LISTITEM
1 1
1 2
1 3
2 2
2 4
2 5
和列表A是例如。 [1,2]
,您可以在SQL中执行此操作:
SELECT LISTID, COUNT(*)
FROM T
WHERE LISTITEM IN (1,2)
GROUP BY LISTID