C++、Python、VBAの計算速度比較

プログラミング言語には、C++やPython、VBAなど様々なものがあります。弊社にご依頼いただく計算プログラム開発では、Pythonでの開発依頼が多い印象があります。また、Microsoft Excelで入力を簡単に行ってVBAで計算実行するようなツールのご依頼もあります。Pythonは比較的簡単にプログラミングできて人気もあるため、よく使われるのだと思います。Excelは、日常的によく使われるツールで、誰でも操作しやすいという特徴があるでしょう。

一方、C++は文法などが複雑でプログラミング自体が難しく、使ったことがないという方が多いようで、これらの中では「C++はちょっと避けたい」と思われている方が多いようです。

しかし、C++は、科学技術計算ではよく使われる言語で、多くの汎用ソフトウェアのソルバがC++で開発されています。C++はC言語をベースにしたオブジェクト指向型の言語で、高速に計算できるという特徴を持っています。

ここでは、C++、Python、Excel VBAの3言語で、計算速度の比較を行ってみます。

計算問題

計算比較に用いる問題は、1次元の熱伝導方程式でFTCS法による差分法で解くものです。詳細は以下の記事を参照してください。

Pythonで熱伝導方程式のFTCS法のプログラムを作ります。FTCS法のPythonプログラムの詳細を説明していきます。科学技術計算講座3「熱伝導方程式のシミュレーション」の第4回目です。

プログラム

プログラムの主要部分は、時間ループ(n=1~nt)内で、要素のループ(i=1~nx-2)を2回計算している箇所です。今回は、nt=100000、nx=1001で計算しています。

以下に各言語のプログラムを示します。

C++ プログラムの表示
    for (int n = 1; n < nt+1; n++) {
        for (int i = 1; i < nx-1; i++) {
            temp_new[i] = temp[i] + dt * alpha * (temp[i+1] - 2.0 * temp[i] + temp[i-1]) / (dx * dx);
        }

        for (int i = 1; i < nx-1; i++) {
            temp[i] = temp_new[i];
        }

        temp[0] = temp_bc;
        temp[nx-1] = temp[nx-2];
    }
Python プログラムの表示
for n in range(1, nt+1):
    for i in range(1, nx-1):
        temp_new[i] = temp[i] + dt * alpha * (temp[i+1] - 2.0 * temp[i] + temp[i-1]) / (dx * dx)

    for i in range(1, nx-1):
        temp[i] = temp_new[i]

    temp[0] = temp_bc
    temp[nx-1] = temp[nx-2]
VBA プログラムの表示
    For n = 1 To nt
        For i = 1 To nx - 2
            temp_new(i) = temp(i) + dt * alpha * (temp(i + 1) - 2# * temp(i) + temp(i - 1)) / (dx * dx)
        Next i

        For i = 1 To nx - 2
            temp(i) = temp_new(i)
        Next i

        temp(0) = temp_bc
        temp(nx - 1) = temp(nx - 2)
    Next n

計算速度比較

計算は、OS:Windows 11、CPU:Core i7-13700F、メモリ:32GBのパソコンを用いて行いました。計算速度は純粋に上記のプログラム部分のみの実行速度を比較しています。

C++のコンパイラはGCC 13.1で、最適化オプションO3とオプションなしで比較しています。VBAはMicrosoft Excel 2408付属のもの、Pythonは3.11の各バージョンを使っています。

次表に、計算にかかった時間とC++(最適化オプションO3)の計算時間を1とした時の比を示します。

プログラム言語計算時間 [秒]
C++(最適化オプションO3)0.04461.0
C++(最適化オプションなし)0.51711.6
VBA3.8586.2
Python58.21305.7

C++で最適化オプションを付けてコンパイルしたものが最も高速で、オプションなしのC++と比べても11倍高速になっています。今回のプログラムは、単純なforループのみのため、効率よく最適化できたものと思われます。

また、VBAは86倍遅く、Pythonは1305倍も遅い結果となりました。

Pythonプログラムの高速化

Pythonのプログラムが異常に遅い結果となりましたが、Pythonは動的型付けのインタープリタ型言語で、今回のようなfor文によるループ処理が非常に遅くなるということが、いろいろ報告されています。

そこで、プログラムを少し変更してみます。配列にNumpyを使い、配列のループ処理をforを使わず書き直します。

Python Numpy使用 プログラムの表示
for n in range(1, nt+1):
    temp_new[1:nx-1] = temp[1:nx-1] + dt * alpha * (temp[2:nx] - 2.0 * temp[1:nx-1] + temp[0:nx-2]) / (dx * dx)

    temp[1:nx-1] = temp_new[1:nx-1]

    temp[0] = temp_bc
    temp[nx-1] = temp[nx-2]

この場合の計算時間は次のようになりました。

プログラム言語計算時間 [秒]
Python(forループ)58.21305.7
Python(Numpy)0.52311.7

Numpyでforを使わないで処理することで、かなり高速化できることがわかります。NumpyはC言語で実装されており、型付きの配列やその演算機能を持っているため、より高速に計算できます。

Pythonでは他にも外部のツールを使うことで、高速化を図る手段もあります。ただし、簡単にプログラミングできるためにPythonを使うという目的からすると、外部ツールを使って複雑にするのを敬遠する方も多いようです。

なお、ここで示したforを使わない手段ですが、今回のような単純なループだと、簡単に書き直すことができますが、ループ中に分岐や何かの判定処理が入っている場合など、単純にはいかない場合も多々あります。他にもクラスを使ってオブジェクトを作っているような場合なども、うまくプログラムを設計しないと高速化できません。

まとめ

プログラム言語による計算速度の比較を行いました。プログラムの内容や処理系によっては、また違った結果になることもあるかと思いますが、今回は数値計算でよく使う繰り返し処理のループをメインとした比較を行っています。

ここでは、非常に単純なプログラムのため、秒単位で比較できましたが、複雑なプログラムや要素数が多い数値計算を行う場合など、C++で数分で終わる計算が、他の言語だと何時間もかかるということがあります。

したがって、何を重視するか(プログラミングの簡便さ、計算速度、費用コストなど)をよく吟味したうえで言語を選択する必要があります。弊社では、特に空間分割や要素数が大規模になるような数値計算を行いたいというご要望の場合には、計算速度を重視してC++での開発をお勧めしています。

スポンサーリンク
科学技術計算のご相談は「キャットテックラボ」へ

科学技術計算やCAEに関するご相談、計算用プログラムの開発などお困りのことは「株式会社キャットテックラボ」へお問い合わせください。

お問い合わせはこちら

フォローする

スポンサーリンク