Python Numpy: Karışıklık - neden Numpy içinde yineleme

oy
0

2 yıl Saf Python programlama ediyorum.

Şimdi Numpy öğreniyorum ve ben karıştı.

öğreticiler ise Numpy saf piton yol daha verimlidir örnekler vermiştir. Verilen örnekler, ama örnek basit yineleme için çalıştığınızda:

import numpy as np
import time
start = time.time()
list = range(1000000)
array = np.arange(1000000)

for element in list:
    pass
print('\n'+str((time.time() - start)*1000)+'\n')
start = time.time()
for element in np.nditer(array, order='F'):
    pass
print('\n'+str((time.time() - start)*1000)+'\n')

Bir çıkış var:

87,67843246459961

175,25482177734375

Üst görülebileceği gibi, Numpy üzerinde yineleme saf Python çok daha az etkilidir.

Sorum şu: moreso anlamıyorum ve Numpy kullanmak neden kendim açıklamak olamaz ve: ne zaman kullanılır?

Oluştur 27/11/2018 saat 18:23
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
2

Numpy gücü size yineleme gerekmez olmasıdır. Orada iterating ile hiçbir sorun, ve aslında bazı durumlarda yararlı olabilir, ancak sorunların büyük çoğunluğu işlevlerini kullanarak numpy olduğunu çözülebilir.

(İle örnekler kullanarak %timeitbunu iterating olmadan doğrudan kullanıldığında liste Numpy her eleman bir numara ekleme gibi basit bir şey daha hızlı açıkça yaparsanız, ipython içinde komuta).

import numpy as np
import time
start = time.time()
dlist = range(1000000)
darray = np.arange(1000000)

# Pure python
%timeit [e + 2 for e in dlist]
59.8 ms ± 140 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
# Iterating numpy
%timeit [e + 2 for e in darray]
193 ms ± 8.61 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# Converting numpy to list before iterating
%timeit [e+2 for e in list(darray)]
198 ms ± 1.38 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# Numpy
%timeit darray + 2
847 µs ± 8.81 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

ortalamasını bulmak gibi daha karmaşık işlemleri ile aynı şey:

%timeit sum(dlist)/len(dlist)
16.5 ms ± 174 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit sum(darray)/len(darray)
66.6 ms ± 583 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
# Converting to list then iterating
%timeit sum(list(darray))/len(darray) 
83.1 ms ± 541 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
# Using numpy's methods
%timeit darray.mean()
1.26 ms ± 5.34 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Kullanmaya anladıktan sonra Numpy daha hızlıdır. Bu verilere bakarak ve sağladığı fonksiyonlar aşina kazanmanın oldukça farklı bir yol gerektirir, ancak bunu bir kez daha basit ve daha hızlı kod ile sonuçlanır.

Cevap 27/11/2018 saat 18:48
kaynak kullanıcı

oy
2

Numpy çok daha hızlı vektör operasyonları ile olduğunu. Kodunuzu değiştirirseniz:

array+=1

yerine:

for element in np.nditer(array, order='F'):
    pass

O numpy ölçüde düzenli piton kodunu geride görebilirsiniz

Cevap 27/11/2018 saat 18:44
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more