私は<word: dictionary>
のペアを含むルックアップテーブルを持っています。 その後、単語リストが与えられたら このルックアップテーブルを使って辞書リストを作成できます。 (毎回、この単語リストの長さは固定されていません)。 これらの辞書の値は、いくつかのキーのログ確率を表します。ここでソフトカップルロジックを使用した高速辞書マージ
は例です:単語リストに
['fruit','animal','plant']
を考えると
、
我々は、ルックアップテーブルをチェックアウトし、
dict_list = [{'apple':-1, 'flower':-2}, {'apple':-3, 'dog':-1}, {'apple':-2, 'flower':-1}]
を持つことができます。私たちは、キーのセットを持って、リストから見ることができます
:キーごと{'apple', 'flower', 'dog'}
、私はdict_list内の各値の合計を与えたいです。 1つの辞書にキーが存在しない場合は、小さな値-10を値に加えます(-10は非常に小さな対数確率とみなすことができます)。
結果辞書は次のようになります。このコードは動作します
dict_list = [{'apple':-1, 'flower':-2}, {'apple':-3, 'dog':-1}, {'apple':-2, 'flower':-1}]
key_list = []
for dic in dict_list:
key_list.extend(dic.keys())
dict_merge = dict.fromkeys(key_list, 0)
for key in dict_merge:
for dic in dict_list:
dict_merge[key] += dic.get(key, -10)
、しかしにおけるいくつかの辞書のサイズとします。ここでは
'dog' = (-10) + (-1) + (-10)
、'flower' = (-2) + (-10) + (-1)
、'apple' = (-1) + (-3) + (-2)
ので、私のpython3コードです 、 dict_merge = {'apple':-6, 'flower':-13, 'dog':-21}
dict_list
は超大(例えば100,000)であり、実際には許容されない200msを超える可能性がある。
主な計算はfor key in dict_merge
ループであり、ループが100,000のループであるとします。
スピードアップソリューションはありますか?ありがとう!そして、読んでいただきありがとうございました〜多分長くて迷惑なこともあります...
P.S. ルックアップテーブルには、大規模な辞書がいくつかあります。だからここにいくつかのチャンスがあるかもしれない。
本当に良い答え厥 - あなたは、これは元のアルゴリズムと異なり、なぜそれが最終的に同じ結果に – spacepickle
感謝を生産する方法の詳細を説明することができます!はい、これはより速いです。しかし 'len(dict_list)'は常に3より小さく、最後にはkeys_numberを走査しなければならないので、それほど高速化はしません。 –
@DongxuZhang私は答えを更新しました。今度は、キーを2回反復する必要はありません。 – f1u77y