Google Colaboratory+Nimで基本文法(ライブラリ)について勉強します.
Google Colaboratory(以下Google Colab)は、Google社が無料で提供している機械学習の教育や研究用の開発環境です。開発環境はJupyter Notebookに似たインターフェースを持ち、Pythonの主要なライブラリがプリインストールされています。
引用元:Google Colabの使い方
nim4colabのインストール
Google Colab で nimコマンドを使用するためのライブラリであるnim4colabをインストールします.
%load_ext nim4colab により%を付けてNimのコマンドを使えます.
!pip install git+https://github.com/demotomohiro/nim4colab.git
%load_ext nim4colab
nimpyのインストール
PythonからNimを呼び出すためのNimのライブラリ、nimpyをインストールします.
nimpyをインストールすることで、後述の fib.nim内で使っているnimpyをコンパイル、ライブラリとして使用することができます.
nimbleはNimのライブラリをインストールするためのコマンドです.
%nimble install nimpy -y
Nimのライブラリ
ライブラリとは?
ライブラリは、ある程度整理された処理を他のプログラムから読み込むことで、使うことが出来るようにしたファイルです。 Nimでは、Pythonと同じようにこのライブラリをインポートしてコードを書いていきます。
ライブラリは基本的に「import ライブラリ名」で使用できます。
nimpy
nimのコードをPythonで使えるようにする.
nim
# Google Colabでnimを使用するためのおまじない
%%nimc
# echo 'Hello, World'
echo "Hello, World"
echo "Hello, World"&"Hello, World" # &は文字列連結演算子
echo "Hello, World \nHello, World"
# echo '''Hello, World, Hello, World'''
# 実行結果
# Hello, World
# Hello, World
# Hello, World
nim(関数定義)
# Google Colabでnimを使用するためのおまじない
%%nimc
# 返り値:result
proc HelloWorld(str1: string): string =
var text = "Hello World\n" & str1 # &は文字列連結演算子
result = text
# 返り値:return
proc HelloWorld2(str1: string): string =
var text = "Hello World\n" & str1 # &は文字列連結演算子
return text
# 返り値:関数名
proc HelloWorld3(str1: string): string =
var text = "Hello World\n" & str1 # &は文字列連結演算子
text
echo HelloWorld("mass")
echo HelloWorld2("mass")
echo HelloWorld3("mass")
nimpy
proc HelloWorld(入力変数: 入力の型): 出力の型 {.exportpy.} =
入力値 | Nimの型名 |
---|---|
なし | void |
文字列 | string |
整数 | int |
リスト | seq[string] |
# セル内のをsample.nimとして書き出し
%%writefile sample.nim
import nimpy
# proc 定義
# 返り値:result
proc HelloWorld(str1: string): string {.exportpy.} =
var text = "Hello World\n" & str1 # &は文字列連結演算子
result = text
# 返り値:return
proc HelloWorld2(str1: string): string {.exportpy.} =
var text = "Hello World\n" & str1 # &は文字列連結演算子
return text
# 返り値:関数名
proc HelloWorld3(str1: string): string {.exportpy.} =
var text = "Hello World\n" & str1 # &は文字列連結演算子
text
# Writing sample.nim
コンパイル
# 関数をコンパイル
%nim c --tlsEmulation:off --app:lib --out:sample.so sample.nim
# output sample.so
!ls
nimpyの実行
# 作成・コンパイルしたsampleファイルをインポート
import time
import sample as sm # Nimでコンパイル
# 開始時間
start = time.time()
# *nimpyの実行
print(sm.HelloWorld('mass'))
print(sm.HelloWorld2('mass'))
print(sm.HelloWorld3('mass'))
# 終了時間
elapsed_time = time.time() - start
# 実行時間
print ("elapsed_time:{0}".format(elapsed_time) + "[se")
# 出力結果
# Hello World
# mass
# Hello World
# mass
# Hello World
# mass
# elapsed_time:0.0008447170257568359[se
sugar
sugarは、Nimの標準モジュールの1つです。
macroを使い、複雑なものを簡潔に書けるようにしています.
ここでは,リストの処理を実装している.
python
nineNum = [1, 2, 3, 4, 5, 6, 7, 8, 9]
oddNum =
for i in nineNum:
if i % 2 == 1:
oddNum.append(i)
print(oddNum)
nim
# Google Colabでnimを使用するためのおまじない
%%nimc
import sugar
var nineNum = @[1, 2, 3, 4, 5, 6, 7, 8, 9]
var oddNum = collect(newSeq):
for i in nineNum:
if i mod 2 == 1: i
echo oddNum
# 実行結果
# @[1, 3, 5, 7, 9]
strformat
文字列の扱いをしやすくするライブラリ
python
a = 1
b = 2
print(f"a+b = {a + b}")
print(f"a-b = {a - b}")
print(f"a*b = {a * b}")
print(f"a/b = {a / b}")
print(f"a%b = {a % b}")
nim
# Google Colabでnimを使用するためのおまじない
%%nimc
import strformat
var a = 1
var b = 2
echo fmt"a+b = {a + b}" #pythonのf-strings 要 strformat
echo fmt"a-b = {a - b}"
echo fmt"a*b = {a * b}"
echo fmt"a/b = {a / b}"
echo fmt"a%b = {a mod b}" # %ではなくmod, 結構罠
# 実行結果
# a+b = 3
# a-b = -1
# a*b = 2
# a/b = 0.5
# a%b = 1
nimpy
# セル内のをsample.nimとして書き出し
%%writefile nimodule.nim
import nimpy, strformat
proc echoAxB(a, b: int): int {.exportpy.} =
echo fmt"a+b = {a + b}" #pythonのf-strings 要 strformat
echo fmt"a-b = {a - b}"
echo fmt"a*b = {a * b}"
echo fmt"a/b = {a / b}"
echo fmt"a%b = {a mod b}" # %ではなくmod, 結構罠
result = 1 # result は特別な変数で,この値が暗黙的にreturnされます.
# 関数をコンパイル
%nim c --tlsEmulation:off --app:lib --out:nimodule.so nimodule.nim
# output sample.so
!ls
import nimodule
a = nimodule.echoAxB(3,2)
print(a)
# 1
まとめ
Google Colaboratory+Nimで基本文法(ライブラリ)について勉強しました.
参考サイト
Speeding up Python code with Nim