ipython My zamanlamaları (a simplier sürümüyle gelen timeit arayüzü ile):
In [57]: timeit np.zeros_like(x)
1 loops, best of 3: 420 ms per loop
In [58]: timeit np.zeros((12488, 7588, 3), np.uint8)
100000 loops, best of 3: 15.1 µs per loop
ben bakmak
Ben şimdiki numpy sürümü ile Mac OS X Yosemite koşuyorum ipython ile kodu (np.zeros_like??
) görüyorum:
res = empty_like(a, dtype=dtype, order=order, subok=subok)
multiarray.copyto(res, 0, casting='unsafe')
iken 210 bir kara kutu - salt derlenmiş koddur. empty
için
Zamanlamaları şunlardır:
In [63]: timeit np.empty_like(x)
100000 loops, best of 3: 13.6 µs per loop
In [64]: timeit np.empty((12488, 7588, 3), np.uint8)
100000 loops, best of 3: 14.9 µs per loop
Yani zeros_like
ekstra zaman o copy
içindedir.
Testlerimde, atama zamanlarındaki fark (x[]=1
) ihmal edilebilir.
Benim tahminim bu zeros
, ones
, empty
tüm erken derlenmiş kreasyonlar. empty_like
, kolaylık sağlamak için eklenmiştir, sadece şekil ve şekil bilgisi girişinden alınmıştır. zeros_like
, kolay programlama bakımına (empty_like
'u tekrar kullanma) hıza göre daha fazla gözle yazılmıştır.
np.ones
ve np.full
ayrıca np.empty ... copyto
dizisini kullanın ve benzer zamanlamaları gösterir.
https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/array_assign_scalar.c
kopyalayan bir dizi için bir skaler (örneğin
0
) dosyası gibi görünmektedir.
memset
kullanımını göremiyorum.
https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/alloc.c, malloc
ve calloc
numaralarına sahiptir.
https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/ctors.c - zeros
ve empty
için kaynak.Her ikisi de PyArray_NewFromDescr_int
'u arar, ancak biri npy_alloc_cache_zero
ve diğer npy_alloc_cache
'u kullanarak biter. alloc.c
aramalar alloc
yılında
npy_alloc_cache
. npy_alloc_cache_zero
, npy_alloc_cache
numaralı telefonu arayarak bir memset
izlemektedir. alloc.c
'daki kod ayrıca bir DİŞLİ seçeneği ile karıştırılır. En calloc
v malloc+memset
fark
Daha: Why malloc+memset is slower than calloc?
Ama önbelleğe alma ve çöp toplama ile , ben calloc/memset
ayrım geçerli olup olmadığını merak ediyorum.
N = (1000, 1000)
M = (slice(None, 500, None), slice(500, None, None))
Line # Mem usage Increment Line Contents
================================================
2 17.699 MiB 0.000 MiB @profile
3 def test1(N, M):
4 17.699 MiB 0.000 MiB print(N, M)
5 17.699 MiB 0.000 MiB x = np.zeros(N) # no memory jump
6 17.699 MiB 0.000 MiB y = np.empty(N)
7 25.230 MiB 7.531 MiB z = np.zeros_like(x) # initial jump
8 29.098 MiB 3.867 MiB x[M] = 1 # jump on usage
9 32.965 MiB 3.867 MiB y[M] = 1
10 32.965 MiB 0.000 MiB z[M] = 1
11 32.965 MiB 0.000 MiB return x,y,z
'zeros' 'memset' kullanır; 'zeros_like', bir ton saçma bir' dolum 'yapmakta etkili gibi görünüyor. Asıl yürütmeyi kovalamayı denedim ama gereksiz yere geniş. – Veedrac
'zeros', memset kullanmaz. –