【Python高速化・tqdm】重い処理をかける際にリストをnumpy配列に変えたら一瞬だった話

for文で繰り返し処理をかける際に、対象のデータが大きいと、処理するのにかなり時間がかかってしまっていました。

待てど暮らせど*のまま表示が変わらず、募るいらいらに対応するために、待ち時間表示と高速化の2つのチップスを紹介しようと思います。

 

前提:今回やりたいこと

pandasで20万行あるCSVファイルを読み込みました。(データフレームにはs1という名前を付ける)

targetカラムには、0~1までのfloat型の数字が入っていますが、すべての行に対して

・値が0.5より小さかったら0

・値が0.5より大きかったら1

という処理をかけたいです。(0.5ぴったしはデータに存在しない)

まず、最初にやった処理は以下の通り。

すると「*」のまましばらく待つことになります。

この時2つの願望が生まれます。

①処理の進捗表示されたら便利だな

②そもそももっと処理早くならんのかね

これらを実現するTipsを今回紹介しようと思います!

 

①処理が今どれだけ進んでいるのかを表示したい

まずは、処理が現在どれだけ進行しているのかわからない、そもそもフリーズしてしまっているのか、といういらいらを解消するために、プログレスバーを表示する方法です。

使うのは「tqdm」です。

使い方はこちらの記事でわかりやすく解説されています。

ざっくりと説明すると、

from tqdm import tqdm でインストールし、、

for文の中にtqdmを組み込む。という感じです。

例)

 

これをやるとどうなるかというと、

こんな感じでプログレスバーが表示されました。便利!

 

②処理を高速化したい

先ほどの処理では、合計で14分強かかってしまっていました。

 

待てないこともないですが、早くなるなら早くしたいもの。

処理の高速化は、ループをかけるリストを、numpy配列に変換することで実現できます。

なんと1秒未満です。あっという間!

 

ちなみにですが、np.array()でnumpy配列に変換することができます。

np.arrayの()の中には、通常のリストや、pandas.seriesを入れることが可能です。

 

たった1行で高速に処理できるようになるなんてありがたすぎますね。

 

ということで、これからはforループで大量の処理を回すときにイライラせずにすみそうです。

 

最後まで読んでいただきありがとうございました。

 

おわり