Ottimizzazione es.2

a
alessio.palma (1480 points)
0 34 56
asked Nov 21, 2018 in Es2 by alessio.palma (1,480 points)
recategorized Nov 21, 2018 by andrea.sterbini
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
236 views

2 Answers

l
lorenzosalone (540 points)
0 3 11
answered Nov 21, 2018 by lorenzosalone (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)
0 34 56
commented Nov 21, 2018 by alessio.palma (1,480 points)
Provo, per fare questa operazione serve un for nidificato?(E' l'unica idea che mi viene in mente)
l
lorenzosalone (540 points)
0 3 11
commented Nov 21, 2018 by lorenzosalone (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)
1 54 165
answered Nov 21, 2018 by a.capobianco1 (16,770 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)
0 34 56
commented Nov 21, 2018 by alessio.palma (1,480 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)
1 54 165
commented Nov 21, 2018 by a.capobianco1 (16,770 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)
0 34 56
commented Nov 21, 2018 by alessio.palma (1,480 points)
Il dizionario a parte conterrà una lista di tuple? Come si può ordinare ogni lista senza un ciclo?
a.capobianco1 (16770 points)
1 54 165
commented Nov 21, 2018 by a.capobianco1 (16,770 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.