技術

Randomクラスは遅い!?

なんとなく関数よりクラス使った方がかっこいいよねということで、

random.randint(0, 10)

とかって書けばいいところを

r = random.Random()
r.randint(0, 10)

とかって書いちゃう場合ってあると思いますけど、上の書き方と下の書き方は等価ではないです。
とりあえずランダムな値が得られればいいやってな文脈では結果は同じと言えるんですが、クラスをインスタンス化する場合__init__の中でseedが呼ばれます。
でこのseedは、処理自体(引数ありでseedを呼んだ場合)が重いうえに、seedの元になる値を選ぶ処理(引数なしでseedを呼んだ場合)が加わるとさらに重いです。

プロファイラで調べたところ、うちの環境では、関数だけの場合と、引数なしインスタンス化+メソッドの場合では後者の方が5倍くらい遅いです。
引数有りインスタンス化+メソッドの場合でも2.5倍くらい遅いです。

ちなみに、インスタンス化を含まずメソッド呼び出しだけを比較すると、関数呼び出しとほぼ同じくらいの速度でした。(Randomクラスが関数バージョンより特に遅いわけではない。要は使い方の問題。)
なので、インスタンスを引数で引き回したり、グローバル変数にすれば関数バージョンと同じ速度で動きます。が、特に理由なくそうするくらいなら素直に関数バージョンを使った方がいいと思います。
import randomでseedは自動的に呼ばれますし。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください