Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: GloGlo 06. 08. 2022, 04:07:32
-
import itertools as it
x = [1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0]
print (len([p for p in it.product(x, repeat=10)]))
Zkoušel jsem to několikrát na 16 GB RAM, ale vždycky to spadlo :D
-
720 GB + něco málo. Dvouprvkový tuple zabere 56 B, zaokrouhleno na 64 B a celé pole bude mít 8 B na prvek. Samotné hodnoty budou sdílené.
Za předpokladu, že ta velikost zahrnuje i alokační overhead, jinak bude dalších 16 B navíc na každý tuple. Navíc může celý seznam růst po skocích, což by mohlo jít až na 128 GB na výsledné pole, místo 80 GB.
-
Teď jsem si všiml, že prvků je 11, ne 10. Takže všechny kalkulace vynásobit 2.6* ...
-
Díky.. to by se celkem prodražilo ;D
-
Proč si to nezkusíš s rostoucími čísly podle délky x nebo hodnoty repeat a tím zjistíš kolik žere prvek a pak už jenom spočítáš počet prvků pro tvé parametry? Stačí místo print uložit vzniklý seznam do proměnné a udělat https://stackoverflow.com/questions/938733/total-memory-used-by-python-process
-
Víš o tom, že to jde napsat jako lazy generátor, kdy to nepotřebuje prakticky žádnou paměť? Jen nevím, k čemu by ti to prakticky bylo, protože ty vygenerované prvky musíš potom stejně nějak zpracovat a je jich fakt hodně...
-
print(len(x)**10)
-
A co ten kod jako ma delat?
-
netusim co ma delat ale vysledek by mel byt 25937424601
a to stacila mala uprava:
counter=0
for _ in (p for p in it.product(x, repeat=10)):
count+=1
a pameti to potrebje pod 6MB se vsim vsudy
a jak se na to divam melo by stacit:
counter = 0
for _ in it.product(x, repeat=10):
counter+=1
ke stejnemu vysledku ...
-
netusim co ma delat ale vysledek by mel byt 25937424601
a to stacila mala uprava:
counter=0
for _ in (p for p in it.product(x, repeat=10)):
count+=1
a pameti to potrebje pod 6MB se vsim vsudy
a jak se na to divam melo by stacit:
counter = 0
for _ in it.product(x, repeat=10):
counter+=1
ke stejnemu vysledku ...
Vysledek je len(x)**10 jak jsem psal vyse.
-
netusim co ma delat ale vysledek by mel byt 25937424601
a to stacila mala uprava:
counter=0
for _ in (p for p in it.product(x, repeat=10)):
count+=1
a pameti to potrebje pod 6MB se vsim vsudy
a jak se na to divam melo by stacit:
counter = 0
for _ in it.product(x, repeat=10):
counter+=1
ke stejnemu vysledku ...
Vysledek je len(x)**10 jak jsem psal vyse.
Jako podle tebe je na to potřeba 25 GB RAM?
Zkoušel sem to teď na Google Cloud na stroji se 128 GB RAM a taky to spadlo :))
-
Jako podle tebe je na to potřeba 25 GB RAM?
Zkoušel sem to teď na Google Cloud na stroji se 128 GB RAM a taky to spadlo :))
Ne, nic takovýho nepsal. Psal, že pokud bude mít ten program dost RAM, tak vypíše 25937424601. Tzn. v poli je 25937424601 prvků, ale samozřejmě každej zabírá o dost víc než jeden byte.
-
A co ten kod jako ma delat?
Chtěl jsem najít maximální možnou hodnotu funkce s mnoha proměnnými a nevěděl, jak na to, tak sem zvažoval zkoušet to hrubou silou a prostě tu funkci volat 25937424601*krát, ale že to není dobrej nápad sem pochopil hodně brzo, když mi to ani nenačetlo array se všema těma kombinacema :D
Naštěstí sem pak po mnoha hodinách hledání objevil scipy.optimize.minimize a ta mi to spočítala za pár vteřin :)
-
Chtěl jsem najít maximální možnou hodnotu funkce s mnoha proměnnými a nevěděl, jak na to, tak sem zvažoval zkoušet to hrubou silou a prostě tu funkci volat 25937424601*krát, ale že to není dobrej nápad sem pochopil hodně brzo, když mi to ani nenačetlo array se všema těma kombinacema :D
Ale to přece nemusíš mít všechno najedou v paměti, nejen že je to iterátor, dokonce se to i přímo jmenuje itertools, aby to každého trklo…
-
Chtěl jsem najít maximální možnou hodnotu funkce s mnoha proměnnými a nevěděl, jak na to, tak sem zvažoval zkoušet to hrubou silou a prostě tu funkci volat 25937424601*krát, ale že to není dobrej nápad sem pochopil hodně brzo, když mi to ani nenačetlo array se všema těma kombinacema :D
Ale to přece nemusíš mít všechno najedou v paměti, nejen že je to iterátor, dokonce se to i přímo jmenuje itertools, aby to každého trklo…
kupodivu itertools neobsahuje funkci pro ziskani poctu prvku iteratoru, obdobu len, pouziva se idiom
sum(1 for _ in iterator)