CythonからC++のvectorを呼んでみる。
この方法はいろんな記事に書かれているが、これにより(Cythonでのlistと比べて)どれくらい速くなるのか気になったので、メモを残しておく(コーディング時にどっちを使うか迷うと思うので)。
%%cython -a
# distutils: language=c++
from libcpp.vector cimport vector
def lis():
cdef:
int i
long sum = 0
list l = []
for i in range(1000000):
l.append(i*2)
for i in range(1000000):
sum += l[i]
print(sum)
def vec():
cdef:
int i
long sum = 0
vector[int] l = []
for i in range(1000000):
l.push_back(i*2) # vectorではpush_backを用いる
for i in range(1000000):
sum += l[i]
print(sum)
と定義して、%timeit lis()
などとして比較した。
結果
lis()
10 loops, best of 3: 94.5 ms per loop
vec()
100 loops, best of 3: 4.44 ms per loop
差は歴然だ。C++のvectorのほうがずっと速い!
(-O3
コンパイルのおかげでforの順番とかが最適化されてるのかもしれないが、そういうことができるのもC++ネイティブに書き換えられてるおかげなので、そういうところを含めて速くなっていると主張したい)