1. はじめに
Pythonの配列の末尾に要素を追加する方法は,いくつかあり,list型やnumpyのndarray型のどちらを使うかで方法は異なる.
これらの方法で,実行速度にどれだけ違いがでるのか疑問に思ったので,かるーくだが調べてみたら,list型に対するappendの比較のみ見つかった(リサーチ不足だったらごめんなさい).
そこで,次節に示す3つの配列に対する要素追加の方法の実行速度を簡単な実験で調べてみる.要素を追加する回数は,10万回とし,時間計測には,timeモジュールを使用した.実験に使用したコードは,いちばん最後にのせておく.
2. 配列に対する要素追加の方法
2.1 list型に対する方法
list.appendを使用する方法.
これは,Pythonに標準で組み込まれる方法で,Pythonの初心者でもよく使う方法のはず.
x = []
for i in range( 10 ):
x.append( i )
2.2 ndarrayに対する方法1
numpy.appendを使用する方法.
import numpy as np
x = np.array( [] )
for i in range( 10 ):
x = np.append( x, i )
2.3 ndarrayに対する方法2
numpy.hstackを使用する方法.
import numpy as np
x = np.array( [] )
for i in range( 10 ):
x = np.hstack( (x,i) )
3 結果
実行時間(秒) | |
---|---|
list.append | 0.0149400234222 |
numpy.append | 4.47969698906 |
numpy.hstack | 4.75327301025 |
若干予想はしていたが,list.appendが圧倒的に早い.
そして,numpy.appendとnumpy.hstackは速度差が出ていない.
やはり,予め必要な配列の大きさが分かっているのなら,ndarrayを,そうでなければlistを使うというのが正解でよいみたい.
4 実験に使用したコード
import numpy as np
def stdAppend(n):
x = []
for i in range(n):
x.append(i)
return
def npAppend(n):
x = np.array( [] )
for i in range(n):
x = np.append(x,i)
return
def npHstack(n):
x = np.array( [] )
for i in range(n):
x = np.hstack( (x,i) )
return
if __name__ == '__main__':
import time
n = 100000
start = time.time()
stdAppend(n)
ttime = time.time() - start
print( "stdAppend: %s" % ttime )
start = time.time()
npAppend(n)
ttime = time.time() - start
print( "npAppend : %s" % ttime )
start = time.time()
npHstack(n)
ttime = time.time() - start
print( "npHstack : %s" % ttime )