Jestem stosunkowo nowy w Pythonie i mam zagnieżdżoną pętlę for. Ponieważ pętle for trwają trochę dłużej, próbuję znaleźć sposób na wektoryzację tego kodu, aby działał szybciej.Wektoryzacja dla pętli NumPy
W tym przypadku, coordin to trójwymiarowa tablica, w której coordin [x, 0, 0] i coord [x, 0, 1] to liczby całkowite, a coordin [x, 0, 2] to 0 lub 1. H jest rzadką macierzą SciPy, a x_dist, y_dist, z_dist i a są zmiennymi.
# 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
Mam również przeczytać, że nadawanie z NumPy, podczas gdy o wiele szybciej, może prowadzić do dużych ilości zużycia pamięci z tymczasowych tablic. Czy byłoby lepiej pójść drogą wektoryzacji lub spróbować użyć czegoś takiego jak Cython?
Dzięki za napiwek! Jednak, gdy próbuję umieścić to w skrypcie (przy użyciu dekoratora @autojit) i przetestować go za pomocą IPython (% timeit% run Test.py), otrzymuję wyniki, które są konsekwentnie wolniejsze od zwykłego Pythona. Czy masz pojęcie, dlaczego tak się dzieje? – sonicxml
@sonicxml To interesujące. Czy korzystasz z tych samych danych, co w moim przykładzie? Autojit musi skompilować swoją funkcję dla każdego nowego typu przekazywanych danych, i robi to w czasie wykonywania. Dlatego dla małych przykładów może być wolniejsza ze względu na czas kompilacji. Czy to może być problem na przykładzie, którego używasz? – jcrudy
Ahh okay. Miałem już mniejszą tablicę, żeby ją przetestować, ale teraz, gdy zrobiłem tablicę, większe urządzenie numba staje się znacznie szybsze niż pyton. – sonicxml