[Julia]Pythonと速度比較

## はじめに

　データ分析や機械学習などに利用できるプログラムとして、Juliaがあると知った。
　以下３点のメリットから今後利用することがあるかもしれないので、備忘録として初歩的なことから欲しかった資料をまとめていく。
　[1]Pythonと同じようにライブラリを利用できる
　[2]実行速度がC言語よりも速い
　[3]PythonやC言語と連携することもできる

## 実行環境
　参考資料[1]で構築したVSCにおけるWSL2で実行している。

## 検証したプログラム
### 比較検証対象のプログラム
 　参考資料[2]で作成した平均値補完およびkNN補完をするプログラム

### python仮想環境
<details>
<summary>reuirements.txt（クリックで展開）</summary>

~~~reuirements.txt
joblib==1.4.2
numpy==2.2.4
pandas==2.2.3
python-dateutil==2.9.0.post0
pytz==2025.2
scikit-learn==1.6.1
scipy==1.15.2
setuptools==75.8.0
six==1.17.0
threadpoolctl==3.6.0
tzdata==2025.2
wheel==0.45.1

~~~

</details> 

### pythonプログラム
<details>
<summary>main.py（クリックで展開）</summary>

~~~main.py
import sys
import os
import time

# `process` ディレクトリをパスに追加
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../process")))

from read import read_csv
from completion_numeric_data import completion_mean
from knn_imputation import fill_missing_data_with_knn

def main():
    #開始時刻
    start = time.time()  

    file_path = "../data/raw/random_data_100.csv"

    #CSVファイルのデータフレーム登録
    df_hunter = read_csv(file_path)

    column = "play_time"

    #平均値で欠損値を補完
    df_hunter = completion_mean(df_hunter, column)

    k = 5
    column = "sub_weapon"
    features = ["HR", "gender", "area", "main_weapon", "play_time"]

    #knnで欠損値を補う
    df_hunter = fill_missing_data_with_knn(df_hunter, column, features, k)

    print(df_hunter)

    #終了時刻
    end = time.time()  
    
    print(f"\n🕒 実行時間: {end - start:.3f} 秒")

if __name__ == '__main__':
    main()

~~~

</details> 

<details>
<summary>read.py（クリックで展開）</summary>

~~~read.py
import pandas as pd

#csvファイルを読み込み、データフレームに登録
def read_csv(csv_file):
    df = pd.read_csv(csv_file,encoding="utf_8")

    return df
~~~

</details> 

<details>
<summary>completion_numeric_data.py（クリックで展開）</summary>

~~~completion_numeric_data.py
import pandas as pd

def completion_mean(df, column):
    # play_time列の平均値を計算（NaNを除く）
    mean_play_time = df[column].mean()

    # NaNを平均値で補完
    df[column] = df[column].fillna(mean_play_time)

    return df
~~~

</details> 

<details>
<summary>knn_imputation.py（クリックで展開）</summary>

~~~knn_imputation.py
from sklearn.neighbors import KNeighborsClassifier
import pandas as pd

def fill_missing_data_with_knn(df, column, features, k):
    # 欠損値が存在するか確認
    if df[column].isna().sum() == 0:
        print(f"[INFO] {column} に欠損値はありません。")
        return df

    # 特徴量とターゲット列のデータを準備
    df_features = df[features + [column]].copy()

    # One-Hot Encoding（欠損のある列は除いてエンコード）
    df_encoded = pd.get_dummies(df_features[features])

    # 欠損のない行（学習用）
    train_df = df_encoded[df[column].notna()]
    train_target = df.loc[df[column].notna(), column]

    # 欠損のある行（予測対象）
    test_df = df_encoded[df[column].isna()]

    # KNN分類器で学習・予測
    model = KNeighborsClassifier(n_neighbors=k)
    model.fit(train_df, train_target)
    predictions = model.predict(test_df)

    # 元のDataFrameに予測結果を補完
    df.loc[df[column].isna(), column] = predictions

    return df

~~~

</details> 

## 結果
### 実行結果
　１つ目の画像が実行前だが、２つ目の実行画像のように欠損値が補完されていることを確認できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391358/b87ae925-849f-474b-a9a3-079c9f45fe78.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391358/e4c2cdaa-6fb5-4153-b096-93cb18bc0d05.png)


### 比較結果
　処理時間について以下のような結果となった。
 　①初回実行時はPythonの方が処理時間が短かったが、2回目以降はJuliaの方が安定して高速だった。
　 ②データ件数が10000件において、JuliaよりもPythonのほうが高速だった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391358/b06641b2-7dab-4c13-b4e5-293378edc308.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391358/a636409e-dd9d-4102-a528-e6a10720354f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391358/eed0dafc-f629-4f36-ae94-3e21de278bf5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391358/6d8c4c7b-09c4-4346-884b-bafd6b58ee13.png)


　①の要因として、Pythonはキャッシュを利用しているため初回から速かったが、Juliaは２回目以降JITコンパイルした情報をITコンパイルしたネイティブコードを「プロセスのメモリ上」にキャッシュしているため、２回目以降の処理時間が早くなる。この違いによって、２回目以降はJuliaのほうが速かったと考えられる。
　②について、データ件数が少なすぎるためJuliaの処理よりもPythonのほうが適切だった可能性がある。また、Pandasの中身はC/C++で記載されているため、大きく速度に差分が出なかったと考えられる。

## まとめ
　JuliaのほうがPythonよりも動作が速いと一般的に言われているが、データ件数が10000件程度ではPythonのほうが処理が速く、金融時系列分析や治療法のシミュレーションなど、大規模なデータや複雑な計算を解くためには有効のようだ。 　

## 参考資料
[1]svoboda, 『[Julia]VSCにおけるWSL2でのJulia　環境構築～サンプルコード実行まで』, https://qiita.com/svoboda/items/6a0ad624bc58a354edb3
[2]svoboda, 『[Julia]kNN実装と速度検証 Part2 (ソースコード～検証結果)』, https://qiita.com/svoboda/items/21d1562dd689992dd658
[3]JuliaHub, 『Pharmaceutical Development』, https://juliahub.com/industries/case-studies/pfizer
[4]JuliaHub, 『Julia for Banking & Finance』, https://juliahub.com/industries/banking-and-finance