1

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

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

对于以前处理过此问题的任何人,您是否有可以分享的替代方法?

4

2 回答 2

0
def bestmatch(A, lists):
     a = set(A)
     return min(lists, key=lambda x:  len(set(x) & a)

使用min循环 C 速度。lambda是一个快速引用a的闭包。该set(A)步骤仅计算一次,而不是在内循环中。

于 2013-01-27T18:55:08.633 回答
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
于 2013-01-27T18:56:35.430 回答