在200k行MySQL数据库上计算成对比较的最快方法

时间:2013-01-27 18:25:44

标签: python

我有一个存储在MySQL数据库中的200k列表。给定列表A,我需要计算A和200k列表的每个列表X之间的相似性得分。假设相似性度量是简单的,例如A和X的集合交集的长度。

鉴于成对比较的性质,我想不出为此改进O(N)的方法,因此改进运行时意味着使用多个CPU内核。现在我使用multithreading.Pool()将此任务拆分为4个核心,但仍需要将近10分钟才能完成。更糟糕的是,我的电脑关机以保护自己。

对于之前处理过此问题的人,您是否有另一种可以分享的方法?

2 个答案:

答案 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