Наконец-то я нашел узкое место в моем коде, но не понимаю, в чем причина. Чтобы решить эту проблему, я изменил все свои вызовы numpy.zeros_like
, чтобы вместо этого использовать numpy.zeros
. Но почему zeros_like
sooooo намного медленнее?
Например (обратите внимание e-05
на вызов zeros
):
>>> timeit.timeit('np.zeros((12488, 7588, 3), np.uint8)', 'import numpy as np', number = 10)
5.2928924560546875e-05
>>> timeit.timeit('np.zeros_like(x)', 'import numpy as np; x = np.zeros((12488, 7588, 3), np.uint8)', number = 10)
1.4402990341186523
Но тогда странная запись в массив, созданный с помощью zeros
, заметно медленнее, чем массив, созданный с помощью zeros_like
:
>>> timeit.timeit('x[100:-100, 100:-100] = 1', 'import numpy as np; x = np.zeros((12488, 7588, 3), np.uint8)', number = 10)
0.4310588836669922
>>> timeit.timeit('x[100:-100, 100:-100] = 1', 'import numpy as np; x = np.zeros_like(np.zeros((12488, 7588, 3), np.uint8))', number = 10)
0.33325695991516113
Моя догадка zeros
использует некоторый трюк процессора и фактически не записывает в память, чтобы выделить его. Это делается "на лету", когда она написана. Но это все еще не объясняет массовое несоответствие времени создания массива.
Я запускаю Mac OS X Yosemite с текущей версией numpy:
>>> numpy.__version__
'1.9.1'