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

Python 在200k行MySQL数据库上计算两两比较的最快方法,python,Python,我在MySQL数据库中存储了200k个列表。给定一个列表a,我需要计算a和200k个列表中每个列表X之间的相似性分数。假设相似性度量是简单的,例如A和X的集合交集的长度 考虑到成对比较的性质,我想不出一种改进的方法,因此改进运行时意味着使用多个CPU核。现在,我使用multi-threading.Pool将此任务分为4个核心,但仍然需要将近10分钟才能完成。更糟糕的是,我的电脑关机是为了保护自己 对于以前处理过这个问题的人,你有没有其他方法可以分享 def bestmatch(A, lists)

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

考虑到成对比较的性质,我想不出一种改进的方法,因此改进运行时意味着使用多个CPU核。现在,我使用multi-threading.Pool将此任务分为4个核心,但仍然需要将近10分钟才能完成。更糟糕的是,我的电脑关机是为了保护自己

对于以前处理过这个问题的人,你有没有其他方法可以分享

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

使用min以C的速度进行循环。lambda是一个快速引用。setA步长只计算一次,而不是在内部循环中计算。

假设列表表是这样的

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

你说的列表是什么意思?什么花的时间最多?从数据库获取数据?实际计算?如果您已经在使用所有内核进行计算,那么就没有更多的CPU可供使用,因此您唯一的选择就是真正加快计算速度,可能是通过计算一些关键指标,如果您已经知道列表太不相似,就可以跳过计算。FWIW,如果您使用的是MySQL,那么整个工作可能会受到IO限制。这意味着Python计算步骤不会占用大部分时间。FastTestWayTM是创建一条SQL语句来完成所有工作,并且只返回更好的匹配列表。换句话说,解决方案并不是真正的Python问题-我之所以接受这一点,是因为我认为Raymond在向OP建议将此问题重新定义为MySQL问题而不是Python问题时是正确的。我认为尝试用Python来完成所有这些可能是一个错误。