PROBLEMA [Python] Diminuire il numero di iterazioni

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
Hello guys,
Ho bisogno di un aiuto. Consideriamo questa porzione di codice:
Python:
                microservices = self.problem.get_microservice_list()
                combinations = itertools.combinations(microservices, 2)
                for i in combinations:
                 #do something
Il problema è riassumibile qui. Se i microservizi sono molti (spesso anche 300) le combinazioni senza ripetizione tantissime.
Questo lo faccio per scambiare degli elementi all'interno di un dictionary(così almeno l'accesso è rapido). Il fine di questi scambi(che anche se in sequenza totalmente a caso) è trovare una soluzione ottima. Mi sono attenuto abbastanza all'algoritmo che prevedeva:

performing all possible
(i) allocations of sensors in fog nodes and (ii) swaps of microservice in fog nodes.

Il che all'interno della soluzione si poteva tradurre soltanto con una permutazione. Un primo pruning con le combinazioni è avvenuto, ma la crescita è ancora esponenziale.

Cosa potrei fare? Non riesco a trovare molte idee
 

Andretti60

Utente Èlite
6,440
5,091
Ciao ilfe, la prima cosa da capire è dove il programma spenda la maggior parte del suo tempo. Il modulo itertool è efficiente, per cui presumo il problema sta nel ciclo for, da cui in Python occorre stare lontani in casi come questo. Se esegui la stessa operazione su tutte le combinazione, hai provato a usare la funzione map() ?
 

Skills07

Head of Development
Staff Forum
Utente Èlite
35,439
11,502
CPU
Ryzen 7 5800x
Dissipatore
Deepcool gammax l240 v2
Scheda Madre
Aourus Gigabyte X-470 ultra gaming
HDD
Samsung Evo 850 250gb ,2tb x 2 toshiba P300, 256 Ssd silicon power, Samsung evo plus 1tb nvme
RAM
32 gb G.Skill Tridentz 3200 mhz RGB
GPU
Zotac - RTX 3070 Ti Trinity OC
Monitor
ASUS TUF QHD 165hz IPS, ITEK GCF 165hz IPS QHD, Samsung Curvo 144hz QHD
PSU
Seasonic Focus 650w 80 platinum
Case
Coolermaster h500p
Periferiche
Asus Tuf Wireless
Net
Fibra Tim 100mb
OS
Windows 10 Pro 64 bit
Come vedi anche @Andretti60 ti ha suggerito una map() in quanto la map non dovrebbe permettere ripetizioni
 

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
Ciao ilfe, la prima cosa da capire è dove il programma spenda la maggior parte del suo tempo. Il modulo itertool è efficiente, per cui presumo il problema sta nel ciclo for, da cui in Python occorre stare lontani in casi come questo. Se esegui la stessa operazione su tutte le combinazione, hai provato a usare la funzione map() ?
Grazie mille per il consiglio, effettivamente non avevo usato la funzione map(). Non era lei la diretta interessata, ma la funzione di itertools starmap() è stata d'aiuto(non avrei mai pensato ci potesse essere tale funzione, ci sono davvero troppe librerie ?).
Sono riuscito a diminuire il tempo di esecuzione, dimezzandolo grazie a varie ottimizzazioni, ma con starmap ho guadagnato quasi 10s su quel for e 10 su un altro, non è affatto male...
Considerando la natura dell'algoritmo non posso sperar in meglio
 
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
6,440
5,091
Grazie mille per il consiglio, effettivamente non avevo usato la funzione map(). Non era lei la diretta interessata, ma la funzione di itertools starmap() è stata d'aiuto(non avrei mai pensato ci potesse essere tale funzione, ci sono davvero troppe librerie ?).
Sono riuscito a diminuire il tempo di esecuzione, dimezzandolo grazie a varie ottimizzazioni, ma con starmap ho guadagnato quasi 10s su quel for e 10 su un altro, non è affatto male...
Considerando la natura dell'algoritmo non posso sperar in meglio
Ricorda che Python e' un linguaggio nato per scrivere script di automazione, ed e' intrinsicamente lento (dovuto anche al fatto di essere interpretato), per lavori "pesanti" bisogna usare librerie di appoggio (che sono scritte in C)
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!