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

Do you need help?

Ottimizzazione es.2

a
alessio.palma (1480 points)
9 36 56
in Es2 by (1.5k points)
recategorized by
Ho scarnificato il più possibile l'es.2 ma vado ancora in timeout agli ultimi due test, qualche consiglio per velocizzarlo? Il mio programma legge il file e crea due dizionari (uno dove tiene conto delle occorrenze in tutto il file delle parole, un altro dove associa ad ogni parola un dizionario formato da chiavi: id dei post in qui quella parola compare, valori: numero di volte che la parola compare in quel determinato post), dopo di che uso d.items per prendere i dizionari associati alle parole nel secondo dizionario, per ogni dizionario idpost:ricorrenza io lo ordino e costruisco la riga da appendere alla tabella  (I2 sarà la lunghezza del dizionario idpost:ricorrenza). Alla fine la ordino e la restituisco, non capisco come migliorarlo ancora. Grazie
638 views

2 Answers

l
lorenzosalone (540 points)
0 5 11
by (540 points)
Anche a me servirebbe capirlo.

Il mio sistema è un po' diverso dal tuo: anziché creare un dizionario solo per trovare 'I1', nel momento in cui compilo la tabella finale per trovare quel valore prendo il sottodizionario {id:numero delle volte in cui la parola è apparsa in quel post} e sommo tutti gli attributi, visto che comunque quando una parola appare sicuramente appare in un determinato post. In questo modo ho meno dizionari e meno conti da fare in ciascun ciclo di parole. Magari questo metodo diminuisce a sufficienza i tuoi tempi
a
alessio.palma (1480 points)
9 36 56
by (1.5k points)
Provo, per fare questa operazione serve un for nidificato?(E' l'unica idea che mi viene in mente)
l
lorenzosalone (540 points)
0 5 11
by (540 points)
No, diciamo che per come l'ho fatta utilizzo nella parte finale, quando creo la lista di dizionari con 'I1', la funzione sum(..) che mi sommerà tutti gli attributi del dizionario conta[parola]
a.capobianco1 (16770 points)
11 54 165
by (16.8k points)
Ho provato anche io con un dizionario di dizionari del tipo dizParola[Parola][post] =occorrenze. Ma per calcolare I3 mi ha va troppo lento.... Quindi ho aggiornato direttamente la lista di diz ad ogni parola lavorando direttamente sulla struttura richiesta e i3 lo calcolo in un diz a parte e ad ogni interazione controllo se è il caso di aggiornare il principale... Rientro nei timeout pochissimo. Non 2,77
a
alessio.palma (1480 points)
9 36 56
by (1.5k points)
Lavorando a parte su I3, per ordinare le tuple contenenti (id,ricorrenza) usi un for che scorre ogni elemento del dizionario e ogni volta ordina quella lista di tuple?
a.capobianco1 (16770 points)
11 54 165
by (16.8k points)
No. L'unico ciclo for di tutto l esercizio è quello che mi scorre la lista di parole. Lavorare I3 è la parte più complicata e facendolo un dizionario a parte c'è il problema di capire quale riga della tabella deve essere aggiornata con il valore calcolato nel secondo dizionario ad ogni post. Per determinare la riga tengo allineati i due dizionari nel senso che ogni riga del dizionario corrisponde la stessa riga nella tabella che si riferisce quindi alla stessa parola. I confronti x sostituire li faccio ad ogni occorrenze con 3 if. Il sistema funziona ma è lento
a
alessio.palma (1480 points)
9 36 56
by (1.5k points)
Il dizionario a parte conterrà una lista di tuple? Come si può ordinare ogni lista senza un ciclo?
a.capobianco1 (16770 points)
11 54 165
by (16.8k points)

ho soltanto due oggetti:

1) lista di dizionari del tipo specificato in esercizio (I1,I2 e parola li scrivo direttamente qui)

2) Dizionario con chiave parola e per ognuna ho per valore un altro dizionario composto da soli tre elementi:

  1. Lunghezza della lista di dizionari
  2. numero di Post
  3. occorrenze

I dizionari (1) e (2) contengono lo stesso numero di elementi di primo livello ovvero se il primo ha 10 righe il secondo è composto da 10 chiavi parola e ad ognuna il sotto dizionario specificato nei tre punti.

Ogni volta che si presenta una nuova occorrenza di parola faccio il confronto tra la tupla in (1) e i valori in (2) e nel caso sostituisco la tupla intera.

Quando ho finito tutte le parole in lista -> il numero (1) è pronto come risultato. 

lo odino con una bella funzione lambda ed il gioco è fatto.

Unico problema ? E' lento da morire.