4
2

More than 1 year has passed since last update.

Julia, C++, Pythonの実行速度を比較してみました。(2021年版)

Posted at

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 倍ぐらい速いということが示されました。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2