19

大きな辞書のいくつかの値を、同じようなキー(同じ日付で異なる形式)を持つ別の辞書の値を使用して更新しようとしています。私が現在使用しているプロセスは遅すぎるので、ボトルネックを減らしたいと思います。

これは私の現在の解決策です(更新されたdictをファイルに書き込みます):

from dateutil import parser
File = open(r'E:Test1.txt','w')

b = {'1946-1-1':0,..........,'2012-12-31':5}
d = {'1952-12-12':5,........,'1994-7-2':10}

for key1, val1 in b.items():
    DateK1 = parser.parse(key1)
    Value = val1
    for key2, val2 in d.items():
        DateK2 = parser.parse(key2)
        if DateK1 == DateK2:
            d[key2] = Value        

Order= sorted(d.items(), key=lambda t: t[0])

for item in Order:
    File.write('%s,%s\n' % item)
File.close()
4

2 に答える 2

32

メソッドを使用してupdate辞書をマージする必要があります。

b.update(d)

.

現時点では、...dのすべてのキーを繰り返し処理していますが、bこれは遅いです。一致するキーを持つ 2 つの辞書を設定することで、これを回避できます (そして、等しい日付は同じようにハッシュされます。おそらく、ここで注目すべきクールなことは、 datetime オブジェクトが hash であるということです)。

b1 = dict( (parser.parse(k),v) for k,v for b.iteritems() )
d1 = dict( (parser.parse(k),v) for k,v for d.iteritems() )

d1.update(b1) # update d1 with the values from b1

編集:

これらの共有値のみが更新されているため、更新を完全に行っていないことに気付きました。代わりに(もう一度1回繰り返すだけで):

for k_d1 in d1:
    if k_d1 in b1:
        d1[k_d1] = b1[k_d1]
于 2012-10-03T22:25:07.363 に答える
3

提案された変更:

  1. .iteritems()の代わりに使用し.items()ます。あなたが持っている方法では、ペアのリストがメモリ内に作成され、反復処理されますが、これは無駄です。
  2. bと の間で日付形式が異なるとおっしゃいdました。月と日が入れ替わっているのだろうか。その場合でも、dキーが何であるかを計算してからメンバーシップを確認することで、大幅な節約を行うことができます。

変更のあるコード:

def switch_month_day(datestr):
  fields = datestr.split("-")
  return "%s-%s-%s" % (fields[0], fields[2], fields[1])

for key, val in b.iteritems():
  DateK = switch_month_day(key)
  if DateK in d:
    d[DateK] = val
于 2012-10-03T23:14:11.850 に答える