0
test2
は、次のコードでtest1
よりも高速ではありませんなぜ私は混乱しています:numpyで配列を事前に割り当てておくべきではないでしょうか?
import timeit
setup = """
import numpy as np
A = np.ones((220, 220, 220))
B = np.ones((220, 220, 220))
class store:
def __init__(self):
self.C = np.empty((220, 220, 220))
Z = store()
"""
test1 = """
C = A + B
"""
test2 = """
Z.C = A + B
"""
print timeit.timeit(test1, setup, number=1000)
print timeit.timeit(test2, setup, number=1000)
: 40.9241290092 40.7675480843
私はZ.C
がメモリを事前に割り当てられたために、少ないオーバーヘッド毎回私があるだろうと思いましたA+B
が追加されていて、それを保存する場所が必要でした。すなわち、malloc
の裏側の電話などが少なくて済みました。私は何が欠けていますか?
'ZC = A + B'は同じ配列を更新していないので、全く新しい割り当てです。 –
ああ、Z.Cはいつも同じメモリアドレスではないのですが、それは既に割り当てられているZのメンバーなのですから? – NLi10Me
'Z.C'は何もあらかじめ割り当てていませんが、今はnumpyの配列を指していて、後で文字列を指すことができます。新しいオブジェクトを指すと、それへの参照がなくなると古いオブジェクトがガベージコレクションされます。 –