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

Do you need help?

Aiuto HW4, ultimi 3 test

Franciscus (6350 points)
7 14 24
in HW4 by (6.4k points)
Buonasera, ho appena riconsegnato l'hw4 e riesco a passare solo 12 test, vi spiego il mio codice e vi chiedo una mano per migliorarlo:

Funzione 1) Leggo i file e ne ritorno una lista di parole

Funzione 2) uso la funzione map e ottengo una lista di dizionari, ciascuno dei quali rappresenta una parola, che associano la chiave posizione al valore carattere della parola (es: [{0:f, 1:o, 2:t, 3:o},{0:s, 1:i}]

Funzione 3) questa credo sia la funzione che mi rallenta; prende la lista ottenuta prima e la itera con un doppio for per poi fare vari controlli if/else: in pratica cerco di iterare ogni dizionario nella lista per aggiungere in un dizionario vuoto la posizione come chiave e unaltro dizionario come valore: che a sua volta ha come chiave il carattere e come valore la frequenza con cui appare in quella posizione

Funzione 4) l'ultima funzione prende questo dizionario e per ogni dizionario al suo interno prende le chiavi, ovvero i caratteri, con il valore più alto e li mette in una lista che viene poi ordinata con sorted, in questo modo prende il valore più alto e in ordine lessicografico, poi aggiungo il primo elemento della lista alla stringa finale

Queste 4 funzioni vengono chiamate all'interno di most_frequent_chars

Volevo chiedervi come potrei velocizzare il mio programma? Quale ragionamento mi aiuterebbe?
344 views

2 Answers

Paolo Gentili (31130 points)
3 6 114
by (31.1k points)
Il sorted alla fine potrebbe rallentare un sacco, ti conviene usare un max o un min con una key = (lambda o funzione che gestisce l'ordine secondo cui prendere i caratteri)
Anche io con sorted ne passavo 12/13 ma facendo questa cosa ho diminuito di 2/3 i miei tempi (circa più di un secondo)
Franciscus (6350 points)
7 14 24
by (6.4k points)
Oh grazie, vedrò di implementarlo
anon3 (10560 points)
20 66 138
by (10.6k points)
Si può riuscire ad evitare completamente l'utilizzo di sorted() per un dizionario, attraverso un lambda?

Perché in alternativa si potrebbero usare cicli for/if o costruire per l'appunto funzioni separate ausiliarie, però non so quanto siano più veloci, considerando che sorted è built-in.
Shangry_ (9930 points)
7 25 76
by (9.9k points)
funzione 2: prova crenado una lista di n dizionari con una list comprehension (in cui n è la len della parola più lunga)

funzione 3: ti consiglio la lettera come chiave e la frequenza come valore (in un pdf di una vecchia lezione del prof. Sterbini viene spiegato come calcolare la frequenza).

funzione 4: il secondo modo che ti scriverò sarà il più veloce: riordinare la lista di dizionari in base al valore, trovare la chiave a cui corrisponde e inserirla in una stringa, oppure inserirle nella stringa da ritornare tramite ciclo for.

non so se può essere stato d'aiuto, in caso prova a creare un altro file in cui implementi questo e confrontali su https://perfpy.com/#/