Jullia Vs. Python Juliaって本当に速いのか？

# Juliaって
Juliaの初心者向けの勉強会に参加してきました。
Pythonも始めたものの少しも身についていないのですが、それならいっそJuliaでもやるか！っとことで、勉強会のお題のBubbleSortでのJuliaとPython3の速度比較をやってみました。

## 実行環境
### 実行マシン
```
OptiPlex 9010
メモリ: 16 GB
プロセッサ: Intel(R) Core(TM) i5-3570 CPU @ 3.40GHz[Cores 4] [Logical/Core 1]
NVIDIA GeForce GTX 1650
```

### OS・Python/Julia
Windows10上にWSL2 + Ubuntu-20.04 を入れて、VSCodeのコンソールから動かしました。

```Bash
C:\Users\nandy>ver
Microsoft Windows [Version 10.0.19041.388]
C:\Users\nandy>wsl -l
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-20.04 (既定)

nandymak@Moon:/mnt/c/Users/nandy$ julia -v
julia version 1.4.1
nandymak@Moon:/mnt/c/Users/nandy$ python3 -V
Python 3.8.2
```
### VisualSourceCode の設定
特に何もしていませんが、以下の拡張機能が入っています。

- Japanese Language Pack for Visual Studio Code (v1.48.1)
- Remote - WSL (v0.44.4)
- Julia (v1.0.0)
- Python (v2020.7.96456)

Remote - WSLによってWSL側にVSCodeから接続すると、その他の拡張機能がコピーされるようです。

## 実行したソース
サンプルで頂いたソースを比較用に少し弄っただけで特にチューニングや、細かい差異をなくすようなことはしていません。
あくまでざっくり比較するためのコードになっています。

### Julia
```Bubblesort-Julia.jl
#/usr/bin/julia

function BubbleSort(array)
    for i = 1:length(array)-1,j = length(array):-1:i+1
        if array[j-1] > array[j]
            temp = array[j]
            array[j] = array[j-1]
            array[j-1] = temp
        end
    end
    return array
end

array = rand(1:1000,30000)
println(length(array))
@time BubbleSort(array)
```

### Python
```Bubblesort-Python.py
#/usr/bin/python3
 
import numpy as np
import time

def BubbleSort(array):
    for i in range(len(array)):
        for j in range(len(array)-1, i, -1):
            if array[j-1] > array[j]:
                temp = array[j]
                array[j] = array[j-1]
                array[j-1] = temp
    return array


array = np.random.choice(np.arange(1,1000),30000)

start = time.time()
print(len(array))
BubbleSort(array)
elapsed_time = time.time() - start
print("elapsed_time:{0}".format(elapsed_time) + "[sec]")
```

## 実行結果の比較
比較は、1～1000の乱数を10,000個、30,000個、100,000個の配列にして、それぞれバブルソートする時間を計測しました。

```bash
nandymak@Moon:~$ julia Bubblesort-Julia.jl
10000
  0.180810 seconds (68.70 k allocations: 3.666 MiB)
nandymak@Moon:~$ julia Bubblesort-Julia.jl
30000
  1.362512 seconds (68.70 k allocations: 3.666 MiB)
nandymak@Moon:~$ julia Bubblesort-Julia.jl
100000
 13.110268 seconds (68.70 k allocations: 3.666 MiB)
nandymak@Moon:~$ python3 Bubblesort-Python.py
10000
elapsed_time:26.179977416992188[sec]
nandymak@Moon:~$ python3 Bubblesort-Python.py
30000
elapsed_time:272.1281180381775[sec]
nandymak@Moon:~$ python3 Bubblesort-Python.py
100000
elapsed_time:2905.497967004776[sec]
nandymak@Moon:~$ 
```
### 整理すると
|個数　|julia　|python　|比較　|
|-------:|---------:|-----------:|------:|
| 10,000| 0.180810|  26.179977|144.79|
| 30,000| 1.362512| 272.128118|199.73|
|100,000|13.110268|2905.497967|221.62|

## 結論
やっぱり速かった。
色々なケースがあるでしょうが、数行の処理のコードで100倍以上の差があり、処理量が多くなると差が広がっていくので、機械学習などでPythonで書く部分が多ければ、Juliaを使って試行錯誤する方がよいケースもあると思われます。
機械学習のライブラリ等の使い勝手が同じかはこれから調べるところですが、同じ覚えるならJuliaもありかと思います。

---
## おまけ
VisualSourceCode に拡張機能：Julia Language Supportを入れることで、VSCodeのコンソールにREPLが動きます。
Juliaのコードをエディタで書いて、Shift+Enterでソースコードを実行してくれたり、ターミナル部分でコードを対話的に実行できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223848/7fa07a59-1e2a-6695-3749-7f2feda58459.png)