はじめての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の人は素直に公式ホームページのインストール方法に従えば良いです.
追記(2018/06/28):Linux,Macのインストールは https://github.com/dom96/choosenim の choosenim を使うと便利です。
実行は簡単でCmd+Bでビルドと実行をしてくれます.楽ですね.
動作例(Nim)
下の添付のようになります(Nim Version 0.17.0 MacBook 12-inch 初代).
動作例(Python)
下の添付のようになります(Python 3.5.2 MacBook 12-inch 初代).
Nim速いですね(にっこり).
モットハヤクデキマスヨネ?
オッシャルトオリデスネ. 最適化オプションを使いましょう.
そしてtimeで測ってみましょう.
$ nim c -d:release monte.nim
$ time ./monte
ほらほら.速くなりました.
Python「ゲセヌ」
100秒もかかってるとやってられないので, これについてはまた今度触れる予定です.
こちらに書きました.
## C++の場合
興味があれば是非トライしてみてください.
私の環境では素直に書いてclang++による最適化オプションを込みで3秒ほどかかります.
[こちらに書きました]
(http://qiita.com/SatoshiTerasaki/items/08c7c3e7e21b706c3205)
その他のReference
モンテカルロ法やPython, Go での実装例については
[1] GoとPythonとGrumpyの速度ベンチマーク ~Googleのトランスパイラはどれくらい速い?~
などを参考にすると良いです(この記事自体はトランスパイラに主眼を置いています).
そして調べて見るとわかるのですが[1]に対する追加検証として,
[2] Re: GoとPythonとGrumpyの速度ベンチマーク
なる記事も存在します. 残念ながら私の環境ではGrumpyが動きませんでした...