Cython 対 GO言語の速度対決
今朝は5時半に起きました。
今月号のソフトウェアデザイン
の第二特集に「Cythonでプログラム高速化」というのがありました。
この記事を読んだ時に「GO言語と比べてみたい」と思いました。RMONに関連した一連の開発も一段落したのでやってみました。
まずは、Dockerで環境作りです。VSCodeのDocker連携で簡単にできます。
テスト環境用のDockerfileは
FROM debian:bullseye-slim
RUN apt-get update && apt-get install -y python3 pip golang
RUN pip install Cython
でよいと思います。
Python版は
root@a88c28e59482:/workspaces/cython/cython# python3 sumtime.py
Python sumtest.sumtest(100000000) が呼ばれた
sumtest(100000000) = 5000000050000000 経過時間 = 4.364828586578369 秒
型指定したCython版は、
oot@a88c28e59482:/workspaces/cython/cython# python3 sumtime2.py
Cython sumtest2.sumtest(100000000) が呼ばれた
sumtest(100000000) = 5000000050000000 経過時間 = 0.026783227920532227 秒
でした。本に書いてある速度より速いです。(Intel i-5のMac miniのDokcer環境です。)
GO言語版は、
package main
import (
"fmt"
"time"
)
func sumtest(n int) int {
fmt.Printf("GO sumtest(%d) が呼ばれた", n)
sum := 0
for i := 1; i < n+1; i++ {
sum += i
}
return sum
}
func main() {
st := time.Now()
n := 100000000 // 1億までの和
s := sumtest(n)
d := time.Since(st)
fmt.Printf("sumtest(%d) = %d\t経過時間 = %v\n", n, s, d)
}
のようなコードです。結果は
root@a88c28e59482:/workspaces/cython/go# go run .
GO sumtest(100000000) が呼ばれたsumtest(100000000) = 5000000050000000 経過時間 = 37.140555ms
でした。Cythonよりちょっと遅い感じですが、Pythonよりかなり速いです。
スッキリしました。
明日に続く
いいなと思ったら応援しよう!
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。
ソフトウェアのマニュアルをnoteの記事で提供しています。
サポートによりnoteの運営にも貢献できるのでよろしくお願います。