Python
numpy

速度:Pythonの配列の末尾に要素追加

More than 1 year has passed since last update.

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 )