メモの祭り

最近はメモすることも忘れ。。。

日付の変換について

あるデータの日付の差分を求め、結果は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秒。
倍以上、速くなった。