关于带切片和不带切片的 numpy 数组赋值所用时间的问题

时间:2021-04-29 22:58:24

标签: arrays python-3.x numpy numpy-slicing

我试图理解将值分配给 NumPy 数组的切片。特别是,如果分片分配比“少分片”分配慢。

示例:

a[0,:10] = 5
vs
a[0:1,:10] = 5

这不经意间让我陷入了试图比较的境地

a[:,:] = a[:,:] + 1
vs
a = a + 1

我无法理解结果

案例 1:数组创建在循环之外

b=np.arange(100000000).reshape(-1,100).astype(np.float64)
out = []
for i in range(50):
    ti1 = time.time()
    b = b+1
    tf1 = time.time()
    tt1 = tf1 - ti1

    ti2 = time.time()
    b[:,:] = b[:,:]+1
    tf2 = time.time()
    tt2 = tf2 - ti2
    out.append((tt1,tt2))
print(len(list(filter(lambda x: x[0] > x[1], out))))

输出:

22

CASE 2:数组创建在循环内

out1 = []
for i in range(50):
    b=np.arange(100000000).reshape(-1,100).astype(np.float64)
    ti1 = time.time()
    b = b+1
    tf1 = time.time()
    tt1 = tf1 - ti1

    ti2 = time.time()
    b[:,:] = b[:,:]+1
    tf2 = time.time()
    tt2 = tf2 - ti2
    out1.append((tt1,tt2))
print(len(list(filter(lambda x: x[0] > x[1], out1))))

输出:

0

看来,第一次创建数组后,b = b + 1必然比b[:,:] = b[:,:] + 1花费的时间少

  • 为什么会这样?
  • b = b + 1b[:,:] = b[:,:] + 1 运行一次后,它们现在占用的时间大约相同,有哪些变化?

0 个答案:

没有答案