1

MySQLデータベースに200kのリストが保存されています。リスト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 速度がループします。ラムダは、aをすばやく参照するクロージャーです。set(A)ステップは、内側のループではなく、1 回だけ計算されます。

于 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 に答える