Morikatron Engineer Blog

モリカトロン開発者ブログ

Windows と Linux で Python 実行速度を比較してみた

こんにちは、モリカトロンでプログラマおじさんをやってる岡島です。

会社で購入した新しい ノートPC を Windows10 と Ubuntu Linux のデュアルブートにしたので、 かねてより気になっていた、OS の違いによる Python の速度比較をしてみました。

CPU や GPU の違いによる速度比較は沢山見かけますが、同じ PC で異なる OS、異なる Python バージョンでの速度比較というのは見かけなかったので、皆様の参考になればいいなと思い測定結果を共有します。

ついでに、Python 3.7 の What's New を見ると、色々と最適化がされているようなので、Python3.6 と Python3.7 も比較したので、 Python のバージョンをなかなか更新できない方もご覧いただくと良いかもしれません。

docs.python.org

テスト環境

PC

テストに使用したのは eX.computer さんの G-GEAR N1588J です。

www.tsukumo.co.jp

スペック:

  • CPU: Intel Core i7-9750H
    • コア数(物理/論理): 6/12
  • GPU: NVIDIA GeForce RTX 2070 Mobile (Mem:8GB)
  • メモリ: DDR4 SODIMM 64GB (32GBからカスタマイズ)

OS と Python

Python 環境は Anaconda を使って構築しました。
Python の実行速度はビルドに使用したコンパイラの違いに影響される可能性がありますので、メモしておきます。

  • Windows10: Windows-10-10.0.17763-SP0
    • グラフィックドライバ: 429.72
    • Python 3.6
      • Version: 3.6.10
      • 実装: Cpython (コンパイラ: MSC v.1916 64 bit (AMD64) )
      • Build: Jan 7 2020 15:18:16
    • Python 3.7
      • Version: 3.7.6
      • 実装: Cpython (コンパイラ: MSC v.1916 64 bit (AMD64) )
      • Build: Jan 8 2020 20:23:39
  • Ubuntu 18: Ubuntu 18.04.3 LTS
    • Python 3.6
      • Version: 3.6.10
      • 実装: Cpython (コンパイラ: GCC 7.3.0)
      • Build: Jan 7 2020 21:14:29
    • Python 3.7
      • Version: 3.7.6
      • 実装: Cpython (コンパイラ: GCC 7.3.0)
      • Build: Jan 8 2020 19:59:22
  • その他
    • NumPy: 1.18.1
    • PyTorch: 1.14
    • cudatoolkit: 10.1

速度比較

Python の速度比較

比較に用いたプログラム

OS や Python のバージョンによる違いを実感したかったのもあり、いくつかの単純なプログラムを作成して、それの速度を比較しました。

github.com

実行結果

Ubuntu/3.6 Ubuntu/3.7 Win10/3.6 Win10/3.7
空ループを1000万回 121.928ms 113.710ms 129.241ms 137.990ms
関数を100万回呼出し 60.324ms 57.115ms 70.861ms 64.045ms
print を10万回 4368.358ms 4516.610ms 4081.143ms 4027.401ms
ジュリア集合の計算 2196.116ms 2117.604ms 3048.247ms 2846.768ms
スレッド生成10万回 3003.542ms 546.747ms 4257.522ms 852.919ms
プロセス生成10万回 13347.779ms 10316.873ms 37916.688ms 44173.236ms

NumPy の速度比較

数値計算には NumPy をよく使いますので、これを使った場合の速度比較もしました。

NumPy の数値計算は C/C++ と Fortran で記述され、また複数ある CPU コアを有効利用して計算するようになっているため、Python と同じ傾向にはならないはずです

比較に用いたプログラム

比較は Github で公開されている以下のベンチマークプログラムで行いました。

A short Python script to benchmark NumPy and show your BLAS setup · GitHub

実行結果

実行結果は以下のようになりました。
試行回数は5回で、その平均値を記載しています。

Ubuntu/3.6 Ubuntu/3.7 Win10/3.6 Win10/3.7
Dotted two matrices 0.676sec 0.680sec 0.598sec 0.590sec
Dotted two vectors of length 0.054sec 0.052sec 0.046sec 0.054sec
SVD of a matrix 0.32sec 0.32sec 0.34sec 0.34sec
Cholesky decomposition 0.09sec 0.09sec 0.10sec 0.11sec
Eigendecomposition 3.30sec 3.27sec 3.48sec 3.48sec

機械学習の速度比較

弊社が実行する Python プログラムの大半は機械学習です。 ということで、GPU を使うような機械学習のプログラムでの速度比較をしてみます。

比較に用いたプログラム

PyTorch の Github リポジトリにある example を使い、MNIST の学習 100エポックにかかった時間を測定しました。

github.com

python example/main.py --epochs=100

実行結果

上記プログラムの、学習とテストを繰り返す処理の時間だけ測定した結果は以下のようになりました。
これについては時間がかかるため、試行回数は1回です。

Ubuntu Win10
Python3.6 686.635sec 1176.503sec
Python3.7 686.389sec 1160.323sec

Windows の実行結果が明らかに遅い

今までの比較結果は「まぁ OS が違うんだし、多少の違いはあるよね」という結果でしたが、 MNIST の結果は明らかに Windows で実行した方が Linux で実行するよりが遅くなっていたので、なぜこんなに速度差が出ているのか少し調べてみました。

Python のプロファイラ (cProfile) で処理時間を見てみると、AdaDelta の計算 ( AdaDelta.step() ) 処理時間に大きな違いがありました。 ( AdaDelta.step() は100エポックで合計10万回くらい実行されます。 )

OS cumtime per call
Ubuntu18 0.79ms
Windows10 3.74ms

どうやら、この関数内で繰り返し実行される GPU での計算に時間がかかっているようです。
これ以外にも GPU で処理している部分が軒並み遅くなっており、その結果 上記の速度差が生まれているようです。

結論

Python そのものや NumPy については 「実行環境によって処理速度が異なるという事を覚えておこう」 という程度で良いと思います。
確かに差異はありますが、だからと言って使用する OS を切り替える必要はないでしょう。

しかし、GPU を使ってディープラーニングをするというのであれば Windows より Linux を選んだ方が良い みたいです。 特に学習に時間のかかるケースでは、Windows で頑張るよりデュアルブートで Linux も動くようにした方が結果として低コストという事になりかねません。
「ローカルにある Windows マシンで学習させてます」という方は一度検討してみてはいかがでしょうか?

最後に

「これは違うんじゃないの?」というご指摘、「これを測定してみたら?」というご提案がありましたら教えていただけると幸いです。

VirtualBox や Hyper-V のような仮想化システム上に構築した環境はどうなるのか興味があるので、誰か調べていただけるととても助かります!