見出し画像

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の運営にも貢献できるのでよろしくお願います。