https://qiita.com/m_yamaguchi116/items/984977529cf72be019f2
を受けて投稿します。
コメントだと反応が薄いので。
環境
macOS Monterey
バージョン 12.0.1
Mac mini(M1, 2020)
チップ Apple M1
メモリ 8 GB
Python の場合
まずは,Python です。M1 チップ対応です。
Python 3.10.0 (v3.10.0:b494f5935c, Oct 4 2021, 14:59:19) [Clang 12.0.5 (clang-1205.0.22.11)] on darwin
ターミナルから起動して,総実行時間を計測しました。
なお,元のプログラムでは for m in range(0, 11): とありましたが,他の言語では 0 〜 9 までなので,for m in range(0, 10): に修正しました。
foo [5] > cat pi.py
limit = 10
for m in range(0, 10):
n = 1
l = 0.0
while n < limit:
l += (1.0 / n) - (1.0 / (n + 2))
n += 4
print(m, l * 4)
limit *= 10
foo [4] > time python3 pi.py
0 2.9760461760461765
1 3.1215946525910097
2 3.1395926555897824
3 3.1413926535917893
4 3.141572653589808
5 3.1415906535898936
6 3.14159245358981
7 3.1415926335405047
8 3.1415926445762157
9 3.1415926445762157
405.394u 0.723s 6:46.37 99.9% 0+0k 0+0io 0pf+0w
405 秒もかかりました。10 までやったら,1 時間以上かかるでしょうから,途中でやめたのも無理ないかなという大惨事。
C++ の場合
続いて,C++ でやってみようと思います。M1 チップ対応です(arm64-apple-darwin21.1.0)。
foo [46] > cpp --version
Apple clang version 13.0.0 (clang-1300.0.29.3)
Target: arm64-apple-darwin21.1.0
この場合も,limit ごとの秒数カウントはなしで,総実行時間を測定します。
foo [6] > cat pi.cpp
#include <stdio.h>
#include <time.h>
int main()
{
double limit = 10;
for (int i = 0; i < 10; i++) {
double l = 0.0;
for (double n = 1; n < limit; n += 4)
{
l += (1.0 / n) - (1.0 / (n + 2));
}
printf("%d %1.16f\n", i, l * 4);
limit *= 10;
}
return 0;
}
foo [14] > gcc -O3 pi.cpp
foo [15] > time ./a.out
0 2.9760461760461765
1 3.1215946525910097
2 3.1395926555897824
3 3.1413926535917893
4 3.1415726535898081
5 3.1415906535898936
6 3.1415924535898099
7 3.1415926335405047
8 3.1415926445762157
9 3.1415926445762157
2.759u 0.005s 0:02.76 99.6% 0+0k 0+0io 0pf+0w
2.759 sec. でした。優秀ですね。
Julia の場合
次は,Julia でやってみることにしました。これも,M1 チップ対応です。
foo [48] > julia --version
julia version 1.7.0
julia は,初回の実行時にコンパイルしますので,コンパイル時間を除く実行時間を知るためにプログラム内部で@time により実際の実行時間を測定します。なお,コンパイル後の実行も初回は実行時間が余計にかかりますが,同じプログラムの2回目以降の実行時間は速くなります。
function f()
limit = 10
for i = 0:9
l = 0.0
for n =1:4:limit−1
l += 1 / n - 1 / (n + 2)
end
println(i, " ", l * 4)
limit *= 10
end
end
@time f()
foo [41] > julia pi.jl
0 2.9760461760461765
1 3.1215946525910097
2 3.1395926555897824
3 3.1413926535917893
4 3.141572653589808
5 3.1415906535898936
6 3.14159245358981
7 3.1415926335405047
8 3.1415926445762157
9 3.1415926445762157
2.673255 seconds (30.96 k allocations: 1.707 MiB, 0.51% compilation time)
2.673 秒でした。C++ と同じくらいということです(ちょっと速いが誤差範囲)。素晴らしい。
ということで,Julia は,少なくとも Python より 150 倍ぐらい速いということが示されました。