たくさん寝太郎の寝床

料理とITと皿回しが好きなオタクのブログ

np.loadtxtが遅いのでpd.read_tableを使ったら速くなった話

こんにちは、たくさん寝太郎です。

f:id:kaworu_mk6:20201020170359p:plain:w300

研究でこんな感じのデータを扱っており、二列目を入力として機械学習でコネコネしています。
二列目を取り出すのにnp.loadtxtを使ってたのですが、ちょっと処理が遅いのが悩みでした。
ちなみに1イベントのshapeが(2400,2)で、全部で4000〜40000イベントくらいです。長いやつでは処理に5分近くかかります。
今収集してるイベント数が全部で1400万くらいです。


プログラムはこんな感じ↓

import numpy as np
import os

path = 'データが入ってるディレクトリ'
event_list = os.listdir('path')
sd_data = []

for e in event_list:
    event = np.loadtxt(path+'{}'.format(e))
    sd_data.append(events[:,1])

X = np.array(sd_data).astype('int16')

これで約6000イベントのデータを処理した時の結果がこちら↓

real	0m55.165s
user	0m48.024s
sys	0m7.272s


「もうちょい速くなるやろ」と思い色々調べてるとpd.read_tableっていうのが良さげでした。
そこでプログラムを次のように変更しました。

import numpy as np
import pandas as pd
import os

path = 'データが入ってるディレクトリ'
event_list = os.listdir('path')
sd_data = []

for e in event_list:
    event = pd.read_table(path+'{}'.format(e), delimiter=' ', header=None, names=['frequency', 'power'])
    sd_data.append(event['power'])

X = np.array(sd_data).astype('int16')

headerを設定しないと先頭行がヘッダーになってしまうので注意です。
これで先程と同じデータを処理した結果がこちら↓

real	0m16.768s
user	0m13.184s
sys	0m3.612s

処理時間が70%減になりました。めでたしめでたし


参考: 詳説Pandasのread_csvとread_table関数の使い方