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も活用しましょう!
コメント