Upgrade to Pro — share decks privately, control downloads, hide ads and more …

stapy79_Pythonistaに伝えたいNimの魅力

Avatar for medy medy
March 10, 2022

 stapy79_Pythonistaに伝えたいNimの魅力

NimはPythonに文法が近く、また同じくインデントルールを使う言語です。
しかしNimは静的型付け言語であり、C言語に変換(トランスパイル)してからコンパイルするという仕様のため、C言語と同じという大変速い実効速度が得られます。
Pythonistaは大変低い学習コストで使えるNimについて紹介します。

Avatar for medy

medy

March 10, 2022
Tweet

More Decks by medy

Other Decks in Programming

Transcript

  1. フィボナッチ数列(mypy型付きPythonとの比較) Python def fib(n: int) -> int: if n <

    2: return n else: return fib(n - 1) + fib(n - 2) print(fib(30)) Nim proc fib(n: int): int = if n < 2: return n else: return fib(n - 1) + fib(n - 2) echo(fib(30))
  2. NimをPythonに組み込んで高速化 引用:Nimを組み込んでPythonを高速化してみた Nim # セル内のfib関数をfib.minとして書き出し %%writefile fib.nim import nimpy proc

    fib(n: int): int {.exportpy.} = if n == 0: return 0 elif n < 3: return 1 return fib(n-1) + fib(n-2) コンパイル nim c --tlsEmulation:off --app:lib --out:ファイル名.so ファイル名.nim
  3. NimからPythonを呼び出す # nimpyライブラリをインストール nimble install nimpy Nimからnumpyを呼び出せる let np =

    pyImport("numpy") ※Pythonの型をNimの世界に変換したりは必要 ※詳しくはこちら https://qiita.com/k4saNova/items/5bb67d1cb40ba90431af
  4. 動的型付け言語の連想配列のように扱えるJSON import json, os # ファイルを開く let file = readFile("./file.json")

    # 文字列をJsonNode型に変換 let node = file.parseJson echo node >> {"key1":{"id":20,"name":"takahashi"},"key2":["val1","val2"]} echo node["key1"]["id"].getInt >> 20 echo node["key1"]["name"].getStr >> "takahashi" echo node["key2"] >> ["val1","val2"]
  5. # %を付けるとJsonNode型に変換される # key1に要素を追加 node["key1"]["email"] = %"[email protected]" echo node["key1"]["email"].getStr >>

    "[email protected]" # key2に要素を追加 node["key2"].add(%"val3") echo node["key2"] >> ["val1","val2","val3"] Goのように構造体を用意する必要がない
  6. iOS

  7. 各OS毎のdllやsoファイルをロードして # whenはコンパイル時に動く when defined(nimHasStyleChecks): {.push styleChecks: off.} when defined(windows):

    const dllName = "libpq.dll" elif defined(macosx): const dllName = "libpq.dylib" else: const dllName = "libpq.so(.5|)"
  8. C言語のドキュメント通りに関数定義作れば、 C言語の関数をNimから呼べる PPGconn* = ptr PGconn PPGresult* = ptr PGresult

    proc pqexec*(conn: PPGconn, query: cstring): PPGresult{.cdecl, dynlib: dllName, importc: "PQexec".}