ループ処理を如何に省くか

Share on:

小規模データセットで動作確認しながらコーディングしたり、最終的にもプラスアルファ程度の規模で動作させるぐらいなら「想定通りに動くコード」に辿り着くことが第一優先。テスト駆動と言い換えても良いです。

一方で、処理件数が桁違いに増えてくると「待ってられない=結果的に動かない」コードになってることもあって。例えば「でかいファイルを纏めてメモリ展開して処理する」みたいなのも、小さいファイルなら動作するけど、大きいファイルになると死んだり。極端に長い1行があるとそこで死んだり(流石に死ぬは言いすぎかもだが)。こういうのを避けるためには、レビューを受けてリファクタリングすると。自分で想像付く範囲でテストするのも大事ですが、何かしらこういうのは「え、そういう死に方するの!?」という場に直面しないとそもそも気づけないことも多いでしょう。

今日はゼミ後に「ある大きなリストとある大きなリストの一致率を計算するのに時間がかかりすぎてて」という話で、コードを見るとPythonな4重ループ?ぐらいの処理。単なるマッチングではないので「ぱっと思いつくままの手順」で書くならそのぐらいになるだろうなと。これを

np.array == 0

みたいに書くと指定した値と合致したか否かのTrue/Falseな配列が得られるので、その配列同士を

np.logical_and

するとかでループなしに判定できるなとか。あれこれお茶会しながらやるのもいとをかし。