Julia言語のすごさを社内にアピールする

# はじめに
現在、業務でビッグデータの処理を行っていますが、Pythonだと処理の実行に20～30分かかってしまい、解消法としてAWSのSagemakerなどのクラウド上での実行を余儀なくされています。また、メモリの関係上、12xlarge程度のかなり大きなインスタンスを選択することになり、コストも馬鹿になりません。
そこで、Juliaを用いて処理を実行したところ、ものの2～3分で完了してしまいました。
このことを報告したところ、Juliaを業務に取り入れる価値があるのではないかという話題になり、Pluto.jlを導入することができそうです。
今回は、導入するかどうかは置いておいて、JuliaがPythonと比較してどの程度速度が出るかを検証して、実際にアピールできればと思います。

# 比較するコード
今回は簡単に以下のようなライプニッツ公式を計算するようなコードを用いた比較を行います。

```python
import math
import time

# ライプニッツ公式計算
def calculate_leibniz_formula(n):
    pi_approx = 0
    sign = 1
    for i in range(n):
        pi_approx += sign / (2 * i + 1)
        sign = -sign
    pi_approx *= 4
    return pi_approx


# 計算する項数(1億回)
n = 100000000
# 計測開始時間
start_time = time.monotonic()

# ライプニッツ公式計算
pi_approx = calculate_leibniz_formula(n)

# 誤差
calculation_error = math.pi - pi_approx
# 計測終了時間
end_time = time.monotonic()
# 計算時間
elapsed_millisec = (end_time - start_time) * 1000

print("円周率近似値  : ", pi_approx)
print("計算誤差      : ", calculation_error)
print("経過時間[msec]: ", elapsed_millisec)
```


参照　↓

https://plainprogram.com/processing-speed-of-program/

上記サイトでも他言語での比較は書かれていますが、Juliaでの比較は書かれていないので丁度いいのかなと思いました。

今回は
- Python
- Julia
- Julia (関数)

の3つを比較していきます。
Juliaでは関数内に処理を書くことで処理速度が上がるとよく耳にするため、その検証も併せて行いたいと思います。

実際に比較するJuliaのコードは以下のようになります。

**Julia**
```julia
# Leibniz formula for π calculation
function calculate_leibniz_formula(n::Int)
    pi_approx = 0.0
    sign = 1
    for i in 0:(n-1)
        pi_approx += sign / (2i + 1)
        sign = -sign
    end
    pi_approx *= 4
    return pi_approx
end

# Number of terms to calculate (100 million)
n = 100_000_000

# Start time measurement
start_time = time_ns()

# Calculate Leibniz formula
pi_approx = calculate_leibniz_formula(n)

# Error in calculation
calculation_error = π - pi_approx

# End time measurement
end_time = time_ns()

# Calculation time in milliseconds
elapsed_millisec = (end_time - start_time) / 1_000_000

println("円周率近似値  : ", pi_approx)
println("計算誤差      : ", calculation_error)
println("経過時間[msec]: ", elapsed_millisec)

```

**Julia (関数)**
```julia
function calculate_pi_approximation(n::Int)
    # Leibniz formula for π calculation
    function calculate_leibniz_formula(n::Int)
        pi_approx = 0.0
        sign = 1
        for i in 0:(n-1)
            pi_approx += sign / (2i + 1)
            sign = -sign
        end
        pi_approx *= 4
        return pi_approx
    end

    # Start time measurement
    start_time = time_ns()

    # Calculate Leibniz formula
    pi_approx = calculate_leibniz_formula(n)

    # Error in calculation
    calculation_error = π - pi_approx

    # End time measurement
    end_time = time_ns()

    # Calculation time in milliseconds
    elapsed_millisec = (end_time - start_time) / 1_000_000

    # Output results
    println("円周率近似値  : ", pi_approx)
    println("計算誤差      : ", calculation_error)
    println("経過時間[msec]: ", elapsed_millisec)
end

# Example usage
n = 100_000_000
calculate_pi_approximation(n)

```

# 結果
結果は以下のようになりました。

```
# Python
円周率近似値  :  3.141592643589326
計算誤差      :  1.0000467121074053e-08
経過時間[msec]:  9483.999999705702

# Julia
円周率近似値  : 3.141592643589326
計算誤差      : 1.0000467121074053e-8
経過時間[msec]: 117.0581

# Julia (関数)
円周率近似値  : 3.141592643589326
計算誤差      : 1.0000467121074053e-8
経過時間[msec]: 2435.4384
```

おやおや～(/・ω・)/
関数での実行は想像以上に遅いですね。
処理内容的にあまり相性が良くないとか？
まあ、それでもPythonよりかは4倍ほど早いですね！

それよりも、JuliaのコードはPythonより81倍速いという結果になりました…
まじで爆速。


(追記)
書いた後に確認して気付きましたが、Juliaのコードどちらも関数使ってますね(;'∀')
Julia (関数)では関数の中に関数が記載されているような感じのため処理速度が遅くなったのかな？
GPT先生に書いてもらったんで、よくわからない(;'∀')

# まとめ
これで少しはアピールができそうですね！
まあ、実際にファイル読み込んだときの時間を比較した方がインパクトありそうなんですけどね…
Juliaが一般的に使用される未来もそう遠くない！気がする！
徐々にJuliaへ移行できるようにこれからも勉強頑張りマウス🐭
それでは！！！