Python'a nispeten yeniyim ve iç içe geçmiş bir döngüye sahibim. Döngülerin çalışması için biraz zaman aldığından, bu kodu daha hızlı çalışabilmesi için bu kodu değiştirmenin bir yolunu bulmaya çalışıyorum.Döngüler için vektörlendirme NumPy
Bu durumda, kord koordinatının [x, 0, 0] ve koordinatının [x, 0, 1] tamsayı ve koordinatın [x, 0, 2] 0 veya 1 olduğu 3 boyutlu bir dizidir. H, bir SciPy seyrek matrisidir ve x_dist, y_dist, z_dist ve a'nın hepsi yüzer. çok daha hızlı, geçici dizilerden bellek kullanımı büyük miktarda yol açabilir ederken
# x_dist, y_dist, and z_dist are floats
# coord is a num x 1 x 3 numpy array where num can go into the hundreds of thousands
num = coord.shape[0]
H = sparse.lil_matrix((num, num))
for i in xrange(num):
for j in xrange(num):
if (np.absolute(coord[i, 0, 0] - coord[j, 0, 0]) <= 2 and
(np.absolute(coord[i, 0, 1] - coord[j, 0, 1]) <= 1)):
x = ((coord[i, 0, 0] * x_dist + coord[i, 0, 2] * z_dist) -
(coord[j, 0, 0] * x_dist + coord[j, 0, 2] * z_dist))
y = (coord[i, 0, 1] * y_dist) - (coord[j, 0, 1] * y_dist)
if a - 0.5 <= np.sqrt(x ** 2 + y ** 2) <= a + 0.5:
H[i, j] = -2.7
Ben de numpy ile bu yayın okudum. Vektörizasyon rotasına gitmek veya Cython gibi bir şeyi kullanmak daha iyi olur mu?
Bahşiş için teşekkürler! Ancak, bunu bir komut dosyasına (@autojit dekoratörünü kullanarak) koymaya ve IPython (% timeit% run Test.py) ile zamanlamaya çalıştığımda, normal Python'dan daha yavaş sonuçlar elde ederim. Bunun neden olduğu hakkında bir fikrin var mı? – sonicxml
@sonicxml Bu ilginç. Örneğimde olduğu gibi aynı verileri mi kullanıyorsunuz? Autojit'in, ona geçirdiğiniz her yeni veri türü için işlevinizi derlemesi gerekiyor ve bunu çalışma zamanında yapıyor. Bu nedenle, küçük örnekler için derleme süresinden dolayı daha yavaş olabilir. Kullanmakta olduğunuz örnekte sorun olabilir mi? – jcrudy
Ahh tamam. Sadece test etmek için daha küçük bir dizi çalıştırıyordum, ama şimdi diziyi daha büyük hale getirdim, numba python'dan çok daha hızlı oluyor. – sonicxml