今回は、PythonからGO言語を呼んでpythonの弱点である速度向上させるアプローチです。
Pythonを語ったとき「コンパイラ」ではない。で炎上しました。
javaでも「コンパイラ」ではないし、C#もコンパイラではないのです。
中間言語に変換して実行するのは、スピード遅いし、第一電池がすぐ減るのです。
GOは、本物っぽいコンパイラーです。
pythonから見ると計算部分を高速化できる可能性があります。
フィボナッチ数を参考にしました。
- 1つがいの兎は、産まれて2か月後から毎月1つがいずつの兎を産む。
- 兎が死ぬことはない。
- この条件のもとで、産まれたばかりの1つがいの兎は1年の間に何つがいの兎になるか?
fib_go.py
from ctypes import *
lib = cdll.LoadLibrary("./fib.so")
for i in range(40):
print ("fib %d %d" %(i, lib.fib(i)))
lib.fib(i)で下記の関数呼ぶだけ。
fib.go
package main
import "C"
//export fib
func fib(n int) int {
if n <= 1 { return n }
return fib(n-1) + fib(n-2)
}
func main() {}
Goで書いた関数をコンパイルする。
> go build -o fib.so -buildmode=c-shared fib.go
実行する
>python fib_go.py
fib 0 0
fib 1 1
fib 2 1
fib 3 2
fib 4 3
fib 5 5
fib 6 8
fib 7 13
fib 8 21
fib 9 34
fib 10 55
fib 11 89
fib 12 144
fib 13 233
fib 14 377
fib 15 610
fib 16 987
fib 17 1597
fib 18 2584
fib 19 4181
fib 20 6765
fib 21 10946
fib 22 17711
fib 23 28657
fib 24 46368
fib 25 75025
fib 26 121393
fib 27 196418
fib 28 317811
fib 29 514229
fib 30 832040
fib 31 1346269
fib 32 2178309
fib 33 3524578
fib 34 5702887
fib 35 9227465
fib 36 14930352
fib 37 24157817
fib 38 39088169
fib 39 63245986
fib 40 102334155
#10倍以上速くなる。