見出し画像

Cythonのすすめ

こんにちは、ものづくりとプログラミングとルービックキューブが大好きなにゃにゃんです。今回はプログラミング言語Cythonの内容です。

2023/06/24追記
現在の私は「Cythonを書くならC++書いた方が良い」と思ってC++を書いています。

Cythonとは

CythonはPythonというプログラミング言語をベースにした文法を持つ言語で、実行前にC言語やC++を経由してコンパイルすることでPythonよりも格段に実行スピードが速くなります。

ものづくりへのつながり

DMM.make AKIBAのマガジンに入れるということで、ものづくりとの関連性を書いておくと、Raspberry Piなど計算資源の乏しい環境でなにか処理を高速に行いたかったりするときにCythonは超強力です。もちろん普通の高性能なPCで重い処理を行うときにも強力な武器となります。

競技プログラミングにおけるCython

AtCoderという日本最大の競技プログラミングサイトではCythonが使えます。基本的にはC++を経由したコンパイルはできず、C言語に限定されてしまいますが、うまくやるとC++へのコンパイルも可能です。気になる方は以下の記事を参考にしてください。

CythonはAtcoderではかなりマイナーですが、特にヒューリスティックコンテスト(マラソン形式コンテスト)では高速化が肝になる場合が多く、力を発揮すると思います。事実、先日行われたAtCoder Heuristic Contest 001で私はCythonで25位という好成績を残せました。気になる方は以下の記事を参照してください。

さらに、私はCythonでHack To The Future 2018本選の世界最高点を保持しています。

CやC++の関数が使える

CythonではCやC++で使える関数を使えます。さらに、Cythonで書いたコードをライブラリとしてPythonで使えば、PythonからCやC++の関数を使うことができます

どれくらい速くなるの?

どれほど高速化できるかを見てみるため、試しにPythonとCythonでこちらを計算してみましょう。

画像1

配列aには0以上1未満の実数が入っています。

Pythonのコードはこちらです(「Pythonコード」という名前にします)。

from random import random
from time import time

n = 10000000
a = [random() for _ in range(n)]
start = time()
ans = 0
for i in a:
   ans += pow(i, 2)
print('time', time() - start, 'sec')

Cythonで高速化のために型を書くと、こうなります(「Cythonコード1」とします)。

 #cython : language_level=3, boundscheck=False, wraparound=False, initializedcheck=False, cdivision=True
from time import time
from random import random

cdef int n = 10000000
cdef double[10000000] a
cdef int i
for i in range(n):
   a[i] = random()
cdef double start = time()
cdef double ans = 0
for i in range(n):
   ans += pow(a[i], 2)
print('time', time() - start, 'sec')

​さらに一部の関数をPythonのものではなくC言語のものに置き換えて高速化します(「Cythonコード2」とします)。

 #cython : language_level=3, boundscheck=False, wraparound=False, initializedcheck=False, cdivision=True
from time import time
from libc.math cimport pow
from random import random

cdef int n = 10000000
cdef double[10000000] a
cdef int i
for i in range(n):
   a[i] = random()
cdef double start = time()
cdef double ans = 0
for i in range(n):
   ans += pow(a[i], 2)
print('time', time() - start, 'sec')

さて、それぞれ実行して実行時間を見てみましょう。

Pythonコード: 3.202秒
Cythonコード1: 1.664秒
Cythonコード2: 0.3150秒

なんとCythonでは型を書いただけでPythonの倍速、さらに関数をPythonのものではなくC言語のものにしたらPythonの10倍速になってしまいました。爆速ですね。場合によっては100倍レベルの高速化ができる場合もあります。

それ、C++で書けば良くない?

どうせCやC++に変換するなら最初からC++で書けば良いと思う方もいらっしゃるでしょう。場合によると思います。Pythonの豊富なライブラリを使いたかったり、コードを書く量を減らしたかったりする場合(Pythonライクな文法なのでC++よりも書く量が少なく済むことが多いです)、Cythonは強力でしょう。

さあ、Cythonを始めましょう。

ここまで読んでくださりありがとうございます。Cythonを触ってみたいと思った方は以下の他の方々の記事などを読んで手を動かしてみてください!

https://qiita.com/pashango2/items/45cb85390193d97523ca

https://qiita.com/en3/items/1f1a609c4d7c8f3066a7







この記事が気に入ったらサポートをしてみませんか?