muszę przyspieszyć następujący kod:Jak mogę przyspieszyć ten dwuliniowy kod?
for i in range(0, 2**N):
output[i] = f(np.array(map(int, bin(i)[2:].zfill(N))))
N
wynosi około 30
, więc kod jest bardzo powolny (trwa około 33 godzin na moim laptopie). Argument funkcji f()
jest binarną reprezentacją indeksu i
, a f()
może być dowolną funkcją, która można wektoryzować. Nie jestem ekspertem, ale żeby przyspieszyć kod, pomyślałem o pozbyciu się pętli for
, co oznacza, że muszę wektoryzować argument f()
. Innymi słowy, muszę utworzyć macierz z binarnymi reprezentacjami liczb od 0
do 2**N
. Można to osiągnąć poprzez następujący kod:
list(itertools.product([0, 1], repeat=N))
że znalazłem w this link. Jednak wydaje mi się, że itertools
jest bardzo powolny i wyraźnie zajmuje dużo pamięci, ponieważ 2**30
ma około miliarda.
Czy mają Państwo jakieś sugestie, aby przyspieszyć ten kod? Z góry dziękuję.
Wydaje się, że wyrzucasz wszystkie oprócz ostatniej wartości 'wyjścia'. – user2357112
Zamiast tworzenia miliardowej tablicy elementów, czemu nie przepisać ponownie jako generatora? – dawg
Wyszukaj generatory i komendę 'yield'. – oliversm