火. 6月 25th, 2024

スキルシェアリング.info

さまざまな問題にITスキルで立ち向かうITソリューションブログ

【Python】リスト内包表記は本当に速いのか

はじめに

どうもMizokeiです。
最近Pythonにハマっており、Python中心の生活を送っているMizokeiです。

Pythonのコーディングに関する本を読んでいますと、「リスト内包表記」で書くと処理が速くなりエレガントであるという内容の記載がありました。

その日読んだ本に限らず、その他の本やネットでも、同様な話がありますが、単純に、

…本当に速いの?

と疑問になりました。几帳面な人が

1ナノ秒くらい速いだけで言ってるんじゃないの?

とも思いました。そりゃまあ、速いのは速いですけど・・・。みたいな。factベースですけど。みたいな。

そこで検証してみることにしました。本記事の実行環境は以下です。

実行環境

  • Windows10 64bit
  • Python 3.7

リスト内包表記とは?

検証に入る前に、「リスト内包表記」の説明を極めてザックリしておきます。初めて知ったり、分からなかったり、気になったりした人は、コーディング周りの難しそうな本を手にとって見るとよいかと思います(本当に中身が難しいかはわかりませんが)。

「リスト内包表記」を単純に説明すると、以下のようなループ文があったとき、

以下のような表現で書くと、早く動くよ、といったものになります。

理由としては、構文で行っていた処理が、インタプリタ内部で実行できるようになるため、とのことです。

ちなみに、上記の2パターンのコードは、いずれも以下のリスト内容になります。

比較用関数を用意

リストにひたすら要素の数だけ追加する関数です。数を増やしながら確認したいため、引数にループの最大数を与えます。これを便宜的に「ノーマル表記」と名付けます。

ノーマル表記

リスト内包表記で記載したループ関数です。こちらも同様、ループの最大数を与えます。こちらも便宜的に「リスト内包表記」と名付けます。

リスト内包表記

以下のコードを参考に処理時間を測定します。

処理時間を測定

では、さっそく2パターンの関数での経過時間を測定してみます。あまりに少ないループ回数だと差が出ないと思われるため、10,000,000回のループを、1倍~10倍までの計10回で試してみました。

すると・・・

項目平均値
ノーマル表記5.978 秒
リスト内包表記 4.352 秒
速度向上率 1.358 倍

試行回数10回とした場合の速度向上率の平均値は、

1.358倍!!

普通にループを行うよりは速いですね。

それぞれの実行時間を表にまとめてみます。

どうも、見ていると、試行回数が多くなっても、実行時間が同程度のものもあるようです。マシンのCPUやメモリの影響もあるかもしれません。

ノーマル表記

試行回数※実行時間
1回目1.044 秒
2回目2.071 秒
3回目3.177 秒
4回目4.065 秒
5回目5.124 秒
6回目6.260 秒
7回目7.268 秒
8回目9.254 秒
9回目9.994 秒
10回目11.527 秒

リスト内包表記

試行回数※実行時間
1回目0.760 秒
2回目1.632 秒
3回目2.430 秒
4回目3.013 秒
5回目3.793 秒
6回目4.674 秒
7回目5.356 秒
8回目6.375 秒
9回目7.780 秒
10回目7.707 秒

※試行回数1回目は10,000,000回のループ、それから試行回数分掛け算し、10回目には、100,000,000回のループを実行しています。

今回使用したソースコード全文

今回使用した、ソースコードの全文を記載しておきます。きれいなコードではないですが、参考となれば幸いです。

以下、実行時の出力ログです。

まとめ

正直、1.01倍とかなんじゃないかと思っていましたが、結構速度向上が期待できそうですね。繰り返しますが、結果は、

1.358倍

でした。

この数値を速いと見るか、たいして変わらないと見るかは自由ですが、相当な件数をループする場合には効果がありそうです。

念の為、件数を減らして実行してみましたが、以下が結果でした。

100,000~1,000,000件のループの場合

項目平均値
ノーマル表記0.057 秒
リスト内包表0.041 秒
速度向上率1.428 倍

減らした場合の速度向上率は平均で、

1.428倍

パフォーマンスとしては上々ですね。

ただ実際のところは、0.057秒かかったプログラムが、0.041秒になるくらいの速度だと、一般的なプログラムを書く程度には影響はしなさそうです。体感でわかりませんものね。早さを意識したいときには、使ってみるといいのではないでしょうか。

と、結論付ける結果でした。(チャンチャン

この記事が誰かの参考となれば幸いです。それでは。