Optymalizacja generatora, modyfikującego listę.

0

Witam, obecnie stawiam mocny nacisk na optymalizcję algorytmów matematycznych. I zastanawia mnie fakt czy można stworzyć generator jednocześnie modyfikujący elementy listy.

Przykład działania:

cal, mod = divmod(n, 2)
for i in range(3, n/2, 2):
    if not s[i]:
        mod+=i
        s[cal::mod] = [1]*len(s[cal::mod])
        fun(result, i)
return result + [i for i in range(n/2+1, n, 2) if not s[i]]

Próbowałem to jakoś przerobić w ten sposób:

return [i for i in range(3, n/2, 2) if not s[i] and s[cal::mod+i] = [1]*len(s[cal::mod+i])]

Jednak generatory nie akceptują żadnego działania przypisania, zarówno gdy robię to funkcją lambda czy osobną.
Napisałem specjalną klasę, jednak to jest wolniejsze. Stąd się zastanawiam czy jest to w ogóle możliwe żeby działało w sposób jednolinijkowy.
POD mnie nie interesuje, bo jest to wyłącznie na mój użytek :).

Wszelkie wskazówki, bądź podpowiedzi pomysłów, mile widziane, próbowałem już wielu rzeczy, jeśli chcecie mogę rzucić więcej przykładów niedziałających, niemniej to raczej nic nie zmieni ;d

0

Możesz napisać własny iterator, ktòry będzie zwracał elementy I jednocześnie modyfikował jej elementy.

0

Jeśli przejmuje Ciebie wydajność, to nie używaj list. Zainteresuj się modułem array, a konkretniej

from array import array
a = array('B', [0]*oczekiwana_długość)

Natomiast w Pythonie występuje rozróżnienie pomiędzy "wyrażeniami" (expressions), a "stwierdzeniami" (statements). Do wyrażeń należy wszystko, co zwraca jakąś wartość, czyli n.p. 5+2, foo(), bar, ale przykładowo wyrażeniem nie jest już for i in range(100): pass, albo def foo(x): bar(x). Podobnie, przypisanie nie należy do wyrażeń. Ponadto, każde wyrażenie jest także stwierdzeniem.

Nie można w warunku użyć przypisania, gdyż nie jest wyrażeniem. Generalnie, lepiej takie ślimaki rozwijać w zwyczajną pętlę.

0

Jeśli chcesz oszczędzać pamięć to można stworzyć prosty generator działający tak:

def generator(param):
  jakieś obliczenia w pętli:
    yield element

teraz dajesz
gen = generator(param):
i teraz gen.next() działa jak iterator po tablicy, a on na bieżąco oblicza nową wartość zamiast za jednym razem wypełniać całą tablicę/listę, to po kolej wylicza oszczędzając pamięć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1