Do you need any help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2021-22 loggatevi e attivatelo nella vostra pagina dei corsi preferiti. A quel punto il corso appare nel menù personale cliccando sul proprio avatar. Per i materiali degli anni precedenti seguite lo stesso metodo.

To join the Programming/Lab 2021-22 course, log-on and select it on the my courses page. It will appear on the personal menu of your avatar. For earlier years use the same method.

VIDEOLEZIONI DEL CORSO DI FONDAMENTI DI PROGRAMMAZIONE AA20-21

PROGRAMMING COURSE VIDEOCONFERENCES AY20-21

[RISOLTO] - Velocizzare Hw4 es1

a.capobianco1 (16770 points)
1 54 165
asked Jan 5, 2019 in Es1 by a.capobianco1 (16,770 points)
retagged Jan 6, 2019 by a.capobianco1

Non riesco a velocizzare l'esercizio 1 HW4.. senza entrare nel dettaglio quello che faccio è:

Leggere una sola volta la lista prelevata dal Json e ad ogni ciclo:

- aggiungo i figli al set dei figli e i padri in quello omonimo.. al termine di tutti i cicli, determino le radici per sottrazione;

- Aggiungo ad un dizionario la coppia {nome elemento: oggetto elemento} (facendo attenzione a non sovrascrivere le chiavi).. giocando con le chiavi del dizionario creo le relazioni tra gli oggetti che, al termine di tutti i cicli, producono la foresta.

- Infine iternado (in un ciclo for differente) sugli oggetti radici richiamo un metodo ricorsivo che mi legge gli alberi e mi restituisce l'output richiesto.

La parte lenta mi sembra sia la generazione della foresta ... potete suggerirmi qualcosa da migliorare?

EDIT:

Alla fine FORSE ho trovato la soluzione da solo... gestire l'esercizio utilizzando le relazioni tra oggetti di Classi è dispendioso... conviene usare un solo Dizionario e lavorare su quello. TEMPI DIMEZZATI!

173 views
closed with note: Ho trovato la soluzione da solo

2 Answers

l
leoli (2930 points)
0 4 19
answered Jan 5, 2019 by leoli (2,930 points)
edited Jan 5, 2019 by leoli

Leggere una sola volta la lista prelevata dal Json e ad ogni ciclo:

Ad ogni ciclo... di che?

Inoltre puoi usare la libreiria time per misurare il tempo che ti ci vuole per fare ogni cosa (cosi che sai quali operazioni richiedono tempo):

import time

prev_time = time.time()

operazione di cui vuoi misurare il tempo

print("tempo impiegato : {}".format(time.time()-prev_time))

.... Poi secondo me quel giocando con le chiavi molto vago c'entra qualcosa...

a.capobianco1 (16770 points)
1 54 165
commented Jan 5, 2019 by a.capobianco1 (16,770 points)
edited Jan 5, 2019 by a.capobianco1
Il file json è una lista di liste. Il ciclo for cui parlo è quello basato sulla lista esterna i cui elementi sono le subliste figlio, padre

Edit: ho già individuato la parte di codice più lenta ed è quella...
l
leoli (2930 points)
0 4 19
commented Jan 5, 2019 by leoli (2,930 points)
Che significa che crei le relazioni tra oggetti ? Usi delle classi ? Come vengono memorizzate queste relazioni? e il giocando con le chiavi?
a.capobianco1 (16770 points)
1 54 165
commented Jan 5, 2019 by a.capobianco1 (16,770 points)

Usi delle classi ?

Si. gli oggetti sono classi. Tu non le usi? che procedimento hai adottato e che tempi hai (più o meno).?

Come vengono memorizzate queste relazioni?

Si tratta di relazione oggetto padre -> lista di oggetti figlio... poi ricorsivamente ricavo altezza e foglie... ma questo va bene come tempo

e il giocando con le chiavi?

Cercherò da essere più specifico sul termine 'giocando'... Non faccio nulla di trascendentale... Se una voce esiste già nel dizionario, aggiungo l'oggetto figlio all'attributo che contiene la lista dei figli; se non esiste la creo e vi aggiungo il primo oggetto figlio.... Queste due semplici istruzioni mi creano la foresta di alberi ad oggetti... stesso sistema usato per HW3 es 3... nulla di nuovo

V
Virgil (760 points)
0 2 5
answered Jan 5, 2019 by Virgil (760 points)
Fai più cose nello stesso ciclo for. Inizializzati subito il dizionario e trovati solo le radici. Quindi basta creare un solo set invece di due. Oppure trova le radici in un'altro modo (avendo l'alberi e la radice è facile trovare le foglie) o in caso non lo usi già; usa symmetric difference o difference (non mi ricordo come si chiama) invece di procedere tramite sottrazione con uno o due cicli for (credo che con questo intendi sottrazione). Poi spero tu stia usando lo slicing per interagire con la lista di liste (formate da due membri).
a.capobianco1 (16770 points)
1 54 165
commented Jan 5, 2019 by a.capobianco1 (16,770 points)
edited Jan 5, 2019 by a.capobianco1

Fai più cose nello stesso ciclo for. Inizializzati subito il dizionario e trovati solo le radici. Quindi basta creare un solo set invece di due. Oppure trova le radici in un'altro modo (avendo l'alberi e la radice è facile trovare le foglie)

Supponiamo che io usi il ciclo for per determinare solo le radici.. come potrei poi costruire l'albero senza usare le classi? dove potrei memorizzare le relazioni che caratterizzano le dipendenze dei nodi di un albero? io utilizzo le classi quindi le relazioni le implemento memorizzando oggetti in attributi di oggetti di rango superiore..è possibile fare altrimenti?

o in caso non lo usi già; usa symmetric difference o difference (non mi ricordo come si chiama) invece di procedere tramite sottrazione con uno o due cicli for (credo che con questo intendi sottrazione).

Non mi sognerei mai di utilizzare i cicli for per fare la sottrazione... per sottrazione intendo la la relativa proprietà degli insiemi... INSIEME A - INSIEME B = DIFFERENZA TRA I DUE (ovvero le radici)... non conosco 'symmetric difference o difference' proverò a vedere se mi ottimizza i tempi.

Poi spero tu stia usando lo slicing per interagire con la lista di liste (formate da due membri).

Qui non ti ho capito... io il json è tipo [[padre, figlio],[padre,figlo] ecc.... io in un solo ciclo for basato sulla lista esterna accedo alle singole sub liste e quindi ad ogni coppia padre/figlio... cosa intendi per slicing? (so che cos'è ma non ho capito come e perché dovrei utilizzarlo)

edit: intendi lst[0] e lst[1] ? se è questo si...