大きな array を初期化するのは何が速いか調べる修行

大きな array、たとえば 100 万個の要素の array を 0 で初期化したい。まずは、普通に 0 が 100 万個入ったリストを作ってしまって、それで初期化する方法 (list)。次に、0 を 100 万回生成するジェネレータで初期化する方法 (iter)。最後に 100 万回ループを回して append していく方法 (loop)。

# kissa.py
import timeit

init = """
import array
num = 1000 * 1000
"""
list ="""
x = array.array('d', [0.0 for u in range(num)])
"""
iter ="""
x = array.array('d', (0.0 for u in range(num)))
"""
loop ="""
x = array.array('d')
for u in range(num):
    x.append(0.0)
"""
print ('list', timeit.Timer(list, init).timeit(100))
print ('iter', timeit.Timer(iter, init).timeit(100))
print ('loop', timeit.Timer(loop, init).timeit(100))

試してみた。

[takeyuki@sunya ~]$ python3 kissa.py
list 12.7168409824
iter 23.1641027927
loop 25.9499599934

そうか。メモリはがっつり消費するけれど、list が速いんだな。当たり前と言えば当たり前か。初期化したい array が二つあるときも

a = [0.0 for u in range(num)]
x = array.array('d', a)
y = array.array('d', a)

で済むし。あ、del a しとかないといけないか。