日付の変換について
あるデータの日付の差分を求め、結果はSQLit3のデータベースに保存するプログラムを作成していた所、strptimeの処理がかなりの時間を占めていたのを発見!!
文字列の日付時間を変換を高速化してみた。
400000行処理して、2倍程度速くなったのでメモっとこう。
#高速化前 with open(sys.argv[1],"r") as fp: st_time , st_value = fp.readline().split('\t') start_time = tmp_date.strptime(st_time, '%Y/%m/%d %H:%M:%S') for line in fp: ed_time , ed_value = line[:-1].split('\t') end_time = tmp_date.strptime(ed_time, '%Y/%m/%d %H:%M:%S') diff_dt=end_time - start_time rec_list=[0]*6 rec_list=(str(line_count),st_time,ed_time,str(diff_dt),st_value,ed_value) cur.execute(u"insert into test_table values(?,?,?,?,?,?);",rec_list) start_time=end_time st_time=ed_time st_value=ed_value line_count += 1
上記を実行すると約23秒。
これをstrptimeを使用せずに日付時間のデータを一旦数値に変換後、datetimeにしてみたのが以下のソース。
#高速化後 with open(sys.argv[1],"r") as fp: st_time , st_value = fp.readline().split('\t') start_time = tmp_date.strptime(st_time, '%Y/%m/%d %H:%M:%S') for line in fp: ed_time , ed_value = line[:-1].split('\t') ed_day,ed_tt= ed_time.split(' ') ed_y , ed_mm , ed_d = ed_day.split('/') ed_h , ed_m ,ed_s = ed_tt.split(':') end_time = tmp_date(int(ed_y),int(ed_mm),int(ed_d),int(ed_h),int(ed_m),int(ed_s)) diff_dt=end_time - start_time rec_list=[0]*6 rec_list=(str(line_count),st_time,ed_time,str(diff_dt),st_value,ed_value) cur.execute(u"insert into test_table values(?,?,?,?,?,?);",rec_list) start_time=end_time st_time=ed_time st_value=ed_value line_count += 1
上記を実行すると約10秒。
倍以上、速くなった。