[Python] 233 複数のCSVファイル内検索 馬名からレース検索 高速化

前回のコードは見るからに効率の良くなさそうな内容だったので書き直しました。

pandasはやめてcsvモジュールで処理しました。

その結果、80秒が5秒に短縮されました。やはりこの種の処理にpandasを使うのはナンセンスだったようです。

この速さなら本式のデータベースにする程でもないように思いますが、迷うところです。

import glob,csv,re,datetime

print('検索したい馬名を入力してください')
name = input()

horseID_l = list()
for year in range(1986,2019 +1):
    for file in glob.glob(f'/Volumes/DATA_HR/horse_racing/horse_list/horse{year}.csv'):
        with open (file, mode="r", encoding="shift_jis") as f:
            reader = csv.reader(f)
            for row in reader:
                if row[1] == name:
                    horseID_l.append([row[0],row[1]])

print(f'{horseID_l}')

if len(horseID_l) >= 2:
    print('該当する馬が複数います。番号を入力してください。')
    for i,data in enumerate(horseID_l):
        print(f'{i+1} {data}')
    num = input()
    id = horseID_l[int(num)-1][0]

elif len(horseID_l) == 0:
    print('該当する馬はいません')
    sys.exit()

else:
    id = horseID_l[0][0]

print(f'検索馬のID {id} 誕生年 {id[0:4]}')

raceID_l = list()
start_year = int(id[0:4]) + 2
print(f'推定デビュー年 {start_year}')
for y in range(start_year,2021 +1):
    for file in glob.glob(f'/horse_racing/race_result/{y}/*/*/*.csv'):
        with open (file, mode="r", encoding="shift_jis") as f:
            reader = csv.reader(f)
            for row in reader:
                if row[22] == id:
                    raceID_l.append(row[21])

print(raceID_l)

race_l = list()
for id in raceID_l:
    for y in range(start_year,2021 +1):
        for file in glob.glob(f'/horse_racing/race_name/{y}/*.csv'):
            with open (file, mode="r", encoding="shift_jis") as f:
                reader = csv.reader(f)
                for row in reader:
                    if row[9] == id:
                        date = row[0]
                        racename = row[3]
                        date_dt = datetime.datetime.strptime(date,'%Y年%m月%d日')
                        date_d = datetime.date(date_dt.year, date_dt.month, date_dt.day)

                        race_l.append([id,date,racename,date_d])

print(f'出走数 {len(race_l)}')
print(sorted(race_l, key=lambda x: x[3]))