Python VS VBA 100万回計算と10回ファイル読み込みテスト

Python エッセイ

Python VS VBA で戦わせる(時間計測)

簡単な計算を100万回させて、その時間を計測して、どちらが早いか戦わせてみました。
※この記事は新しくプログラムを作成して、対戦しなおしました。

PCのスペック

●[Mouse PC

AMD Ryzen 7 5700X 8-Core Processor 3.40 GHz
32.0 GB
64 ビット オペレーティング システム、x64 ベース プロセッサ
Windows 11 Pro
ストレージ:SSD()

テスト条件は、

①簡単な計算

100万回のループで、変数xに(x+i)/iを入力(※iはループ変数)

テストコードと結果

左画像:Python 右画像:VBA 簡単な計算100万回


    

 

プログラミ実行時間 計測結果

 

Pythonが57msecに対して、VBAは8msecと7倍以上の速度差でVBAの圧勝でした。

※以前の記事では、演算回数が間違っていたため、Pythonの勝利と誤った内容でした。申し訳ございませんでした。m(_ _)m

 

なぜVBAが速いのか?

VBA(VisualBasicforApplications)がPythonなどの動的スクリプ
ト言語に比べて高速に計算できる大きな理由は、言語構造(静的型
付け)と実行処理メカニズム(中間言語コンパイル)の組み合わせ
にあります。

主な理由は以下の3点です。

1.「静的型付け」によるメモリアクセスの最適化VBAでは、変数を
定義するときに型(LongやDoubleなど)をあらかじめ固定します。

VBA

Dim i AsLong

Dim x AsDouble

VBA:変数iがメモリ上のどこにあり、何バイト(Longなら4バイト)
の整数データであるかが実行前に明確に決まっています。そのため、
CPUは無駄なデータ確認を行わずに直接メモリにアクセスして超高
速に計算を実行できます。

Python(比較):動的型付け言語であるPythonでは、変数に型を指
定しません。そのため、数値ひとつを計算するだけでも、裏側で「
この変数の型は何か」「どのような計算規則を適用すべきか」をCP
Uが毎ループ確認するオーバーヘッドが発生します。

2.中間コード(P-Code)への事前コンパイル

VBAはスクリプトのように見えますが、実は事前にコンパイルされ
る言語です。

VBA:コードを保存
・作成した時点で、VBAエンジンはプログラムを「P-Code(Pseudo-
Code)」と呼ばれるCPUが解釈しやすい中間命令群に変換します。
実行時にはこの中間コードを高速に順次処理するだけで済むため、
処理が非常にスムーズです。

Python(比較):一般的なPythonの実装(CPython)はインタプリタ
(逐次解釈)方式をとっており、実行時にコードを1行ずつ読み解
きながら動作するため、ループ処理などで呼び出しのオーバーヘッ
ドが積み重なります。

3.C/C++で作られた堅牢なCOMランタイムエンジン

VBAの実行基盤(VBA7.dllなど)は、MicrosoftがC++を使って極限
まで最適化して作ったネイティブエンジンです。

ExcelやWindowsのネイティブなメモリ領域と密接に連携しており、
メモリの確保や解放、数値演算といった基本処理が非常に低レイヤ
ー(OSやCPUに近い階層)で効率的に処理されるよう最適化されて
います。

【参考】C#でも実験

以下のような、同様の計算プログラムを実行しました。

using System;
using System.Diagnostics;

class Program
{
static void Main(string[] args)
{
double x = 0.0;

// 高精度タイマーの作成と開始
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();

// 1から100万回までループ処理
for (int i = 1; i <= 1000000; i++)
{
x = (x + (double)i) / (double)i;
}

stopwatch.Stop();

// 経過時間をミリ秒単位で取得
double elapsedTimeMs = stopwatch.Elapsed.TotalMilliseconds;

Console.WriteLine(“========== C# 計測結果 ==========”);
// C# 5互換の書き方に変更({0} や {1:F3} を使用)
Console.WriteLine(“実行結果 x : {0}”, x);
Console.WriteLine(“処理時間 : {0:F3} ms”, elapsedTimeMs);
Console.WriteLine(“=================================”);
}
}

結果は、3.4msecと高速でした。

========== C# 計測結果 ==========
実行結果 x : 1.000001000001
処理時間 : 3.463 ms
============================

ここで思うことは、VBAの8msecも大したものですっ!ということですね。
Excel操作を入れるとVBAの威力は半減どころか、劇的に遅くなりますので
あくまで、計算部分をうまく利用するとよいという話でした。

VBAのプログラムも生成AIを使って、簡単に作成できる時代になりました。
基礎知識をさらっと身に着けて、VBAも活用しましょう!

コメント