我很困惑为什么test2
在以下代码中不比test1
快:
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
或类似内容的调用。我错过了什么?
分配是一个快速的操作,添加成本更高:
In [7]: %timeit np.empty((220, 220, 220))
1000 loops, best of 3: 472 µs per loop
In [8]: u= np.ones((220, 220, 220))
In [9]: %timeit u+u
10 loops, best of 3: 73.5 ms per loop
因此,即使您正确更新了数组(Z.C[:]= A+B
(,您也不会赢得很多(~0.5%(。