Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

Do you need help?

[RISOLTO] - Velocizzare Hw4 es1

a.capobianco1 (16770 points)
11 54 165
in Es1 by (16.8k points)
retagged by

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!

497 views
closed with the note: Ho trovato la soluzione da solo

2 Answers

l
leoli (2930 points)
0 5 19
by (2.9k points)
edited by

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)
11 54 165
by (16.8k points)
edited by
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 5 19
by (2.9k 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)
11 54 165
by (16.8k 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
by (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)
11 54 165
by (16.8k points)
edited by

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...