不应该在numpy中预分配数组更快吗?

时间:2017-08-18 16:29:25

标签: python python-2.7 numpy malloc

我很困惑,为什么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或者更少类似的东西。我错过了什么?

1 个答案:

答案 0 :(得分:0)

分配是一项快速操作,增加费用更高:

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%)。