python2.x系でfor文でrange()を使う際に気をつけたいこと

おそらく日常的にpythonを書いてる人からしたら当然の内容なんだと思いますが、たまに簡単なスクリプトを書く程度に利用していた僕は今日初めてしりました。

 

とあるスクリプトを書いているときに

としてループを実行させました。

すると、16GB載せているメモリが残り20MBとかくらいになっちゃって、まったく処理が進まない・・・。

あぁーさすがに数が大きかったか・・・。と、この処理を別の手段で書く方法を探すことにしました。

 

公式リファレンスを確認すれば、すぐにわかりますがrange()関数は第一引数から第二匹数までの数を列挙したリストを返します。range()関数公式リファレンス

上記サンプルのようにかけば

[1, 2, 3, 4, 5, 6, 7, 8, 9, … , 429496967295]

というリストが生成されます。これによって、1から429496967295までの全ての整数が、メモリ上に確保されることになり、あっという間にメモリを食いつぶします。

というわけで、こういう時(非常に大きい回数繰り返しを行いたいとき)は、xrange()関数を利用します。

上記サンプルを書き直すと

xrange()関数を利用することによって、リストを生成するのではなく、xrange()オブジェクトを生成し、指定した範囲をリストでメモリに確保せずに、都度数字を生成して返します。

 

ちなみに、python3.x系ではxrange()関数は廃止され、range()関数がxrange()関数と同じようにリストを生成するのではなく、rangeオブジェクトを返します。

リストが欲しいときは

とすればOKみたいです。

python3.x系ではxrange()は廃止されているので、2系を3系に移行する場合は注意が必要です。

※個人的には互換残すために、そのままxrange()を残してもよかったんじゃないかなぁ・・・とも少しだけ思いますが、printが関数になったり、より良く変えていくには、切り捨ても必要なのかもしれません。

 

 

コメントを残す

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