クロの制作日記

pythonのリストとnumpyのappendの速度比較

はじめに

python機械学習を行う際に、行列を作成するだとか、計算した重みや予測値を保存するだとかで、配列にappendすることが多いと思います。

そこで気になるのが、リストのappendとnumpyのnp.appendで速度の違いがあるのかということです。


機械学習によっては、何千回何万回とappendをすることもあると思いますので、少しでも速度が違うと、全体の処理速度が大幅に差がでることになってしまいます。

なので、今回はその比較を行っていこうと思います。

結論

おそらく結果だけ知りたいという人のほうが多いと思いますので結論から述べると、

リストの圧勝です。

これは私的には意外で、numpyは全てにおいて最強で爆速なんだと思っていました。実際、行列演算とかはnumpy使ったほうが簡単で爆速です。

この結果からnumpyのappendの処理方法が原因で、おそらく配列を静的に確保しておりappendをするたびにメモリにアクセスして配列を再定義しているからだと思います。

NumpyはC言語で内部処理を行っているおかげでpythonで記述するより爆速になっているのですが、今回の場合は逆にそれがあだになったようです。




速度比較実験

一応速度比較を行った際のプログラムとその結果を載せておきます。

compalison_append.py
import numpy as np
import time

# 実行回数
epoch = 100
print("epoch :{0}".format(epoch))

#---------------------------------------------------
# リストのappend
start_list = time.time()
sample_list = []
for i in range(epoch):
    for j in range(epoch):
        sample_list.append(j)
end_time = time.time() - start_list
print("time :{0}".format(end_time),"[sec]")
#---------------------------------------------------

#---------------------------------------------------
# numpyのnp.append
start_numpy = time.time()
sample_numpy = np.array([])
for i in range(epoch):
    for j in range(epoch):
        sample_numpy = np.append(sample_numpy, j)
end_time = time.time() - start_numpy
print("time :{0}".format(end_time),"[sec]")
#---------------------------------------------------
実行結果
epoch :10
('time :2.31266021729e-05', '[sec]')
('time :0.000673055648804', '[sec]')
epoch :100
('time :0.00163793563843', '[sec]')
('time :0.0677540302277', '[sec]')
epoch :300
('time :0.0219237804413', '[sec]')
('time :7.77134418488', '[sec]')
epoch :500
('time :0.0420799255371', '[sec]')
('time :77.4816389084', '[sec]')
epoch :800
('time :0.0741958618164', '[sec]')
('time :587.838928938', '[sec]')