Nim

モンテカルロでNimってみよう

はじめてのQiitaデビューです.

お勉強のがてらモダンな言語にトライしていきたいと思います.

本日はNim

本日はNimでよくあるモンテカルロ法を書いてみます.

Nim はプログラム言語の一つです. 
見た目 Python っぽくかけて C /C++ に近い速度を出すというロマンあふれる言語です.

知ったっきっかけは下記サイト偶然のぞいてからです.
この頃 流行りの 言語たち(他)でベンチマーク (Dart, Go, Julia, Nim, Python, Rust 他)

書いてみやう(Nim)

ららららと書いてこんな感じになります.

#monte.nim
import random
import system

const NUM=100000000

if isMainModule :
  var x,y:float64
  var counter=0
  for i in countup(0, NUM):
    x=random(1.0)
    y=random(1.0)
    if x*x+y*y < 1.0:
      counter+=1

  var pi=4.0*float64(counter)/float64(NUM)
  echo pi
  system.programResult = 0

varで変数を宣言するという部分を無視するとなんとなくPythonっぽいですね. 

 書いてみやう(Python)

#monde.py
import random
NUM = 100000000

def monte():
    counter = 0
    for i in range(NUM):
        x = random.random()
        y = random.random()
        if x*x+y*y < 1.0:
            counter += 1
    pi = 4.0*counter/NUM
    print(pi)

def main():
    monte()

if __name__ == '__main__':
    main()

あまり変わらないですよね.これがNimのウリの一つだと思います.

皆さんも書いてみましょう

SublimeText

Editorは各自好みのものを選べば良いでしょうが,ここではSublimeTextを使ってみます.
Cmd+Shift+p を押してパッケージコントロールのインストールを選択してNimと打つと必要な NimLime というパッケージが出てきますのでそれをインストールしましょう. SublimeTextを再起動してNimのコードを入力するとコードがシンタックスハイライトされます. 保存するたびにシンタックスのチェックが入ってここがおかしいよなどと教えてくれます.

動かしてみましょう.

Nimはインストールしておきましょう.話はそれからです.

一番楽なのはMacの人はbrew install nim で.
Windowsの人は素直に公式ホームページのインストール方法に従えば良いです.

実行は簡単でCmd+Bでビルドと実行をしてくれます.楽ですね.

動作例(Nim)

下の添付のようになります(Nim Version 0.17.0 MacBook 12-inch 初代).
スクリーンショット 2017-09-17 19.46.03.png

動作例(Python)

下の添付のようになります(Python 3.5.2 MacBook 12-inch 初代).
スクリーンショット 2017-09-17 19.52.42.png

Nim速いですね(にっこり).

モットハヤクデキマスヨネ?

オッシャルトオリデスネ. 最適化オプションを使いましょう.
そしてtimeで測ってみましょう.

$ nim c -d:release monte.nim
$ time ./monte

スクリーンショット 2017-09-17 20.04.28.png

ほらほら.速くなりました.

Python「ゲセヌ」

100秒もかかってるとやってられないので, これについてはまた今度触れる予定です.
こちらに書きました.

 C++の場合

興味があれば是非トライしてみてください.
私の環境では素直に書いてclang++による最適化オプションを込みで3秒ほどかかります.
こちらに書きました

その他のReference

モンテカルロ法やPython, Go での実装例については
[1] GoとPythonとGrumpyの速度ベンチマーク ~Googleのトランスパイラはどれくらい速い?~
などを参考にすると良いです(この記事自体はトランスパイラに主眼を置いています).
そして調べて見るとわかるのですが[1]に対する追加検証として, 
[2] Re: GoとPythonとGrumpyの速度ベンチマーク
なる記事も存在します. 残念ながら私の環境ではGrumpyが動きませんでした...