При измерении потребления памяти np.zeros
:
import psutil
import numpy as np
process = psutil.Process()
N=10**8
start_rss = process.memory_info().rss
a = np.zeros(N, dtype=np.float64)
print("memory for a", process.memory_info().rss - start_rss)
результат неожиданный 8192
байт, т.е. почти 0, в то время как для дублирования 1e8 потребуется 8e8 байт.
При замене np.zeros(N, dtype=np.float64)
на np.full(N, 0.0, dtype=np.float64)
объем памяти, необходимый для a
, составляет 800002048
байт.
Существуют похожие расхождения во времени выполнения:
import numpy as np
N=10**8
%timeit np.zeros(N, dtype=np.float64)
# 11.8 ms ± 389 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit np.full(N, 0.0, dtype=np.float64)
# 419 ms ± 7.69 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Т.е. np.zeros
до В 40 раз быстрее для больших размеров.
Не уверен, что эти различия есть для всех архитектур / операционных систем, но я наблюдал это по крайней мере для x86-64 Windows и Linux.
Какие различия между np.zeros
и np.full
могут объяснить разное потребление памяти и разное время работы?