Вопрос о времени, затраченном на назначение массива numpy с срезами и без срезов

#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
 

СЛУЧАЙ 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 1 и b[:,:] = b[:,:] 1 были запущены один раз, что теперь они оба занимают примерно одинаковое количество времени?