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

Do you need help?

Velocizzare una funzione

s
stef (430 points)
1 2 4
in HW4 obbligatorio by (430 points)
Buongiorno,uso una funzione esterna per dividere in sillabe ovvero un ciclo for e una serie di if, ma la funzione e' lentissima sui test piu corposi.

Quache consiglio su come migliorare la velocita di esecuzione?
411 views

1 Answer

twgever (17470 points)
8 29 105
by (17.5k points)
-cerca di chiamare meno volte possibile la funzione. Quindi meglio passare tutto il testo in una volta, e poi gestire la situazione, piuttosto che passare il testo riga per riga.

-senza sapere come è articolata la funzione, è difficile darti consigli, però alcune cose abbastanza comuni, da evitare sono ad esempio evitare di salvarsi gli ES che non servono, infatti ti servono solo i finali.

-la tua funzione di divisione in sillabe dovrebbe essere molto semplice. La cosa che porta via più tempo è controllare ad uno ad uno i caratteri. Dopo ogni controllo, il programma dovrebbe fare un'operazione semplice, tipo aumentare un contatore.
J
JunLe Ye (450 points)
0 4 6
by (450 points)
Scusa come posso ottenere i finali senza salvare gli ES? Io per ottenere i finali prendo l'ultimo elemento della lista di ES e lo aggiungo in una lista vuota
twgever (17470 points)
8 29 105
by (17.5k points)
salvi solo i finali, ma non gli ES. Ad esempio puoi partire dall'ultimo carattere del verso, ti salvi solo il primo es, e poi continui ad analizzare, contando gli altri ES.

oppure da una parte conti, e dall'altri scorri solo i versi, trovandoti le finali e partendo dall'ultimo carattere di ogni verso (anche se io ti consiglierei di fare solo un ciclo piuttosto che due.

Un'altra maniera è salvare ogni carattere dentro una stringa, che viene resettata non appena trovi una vocale seguita da una consonante, e che viene salvata nella lista delle finali quando finisce il verso (però  così ti risparmi meno tempo, rispetto all'altro metodo)
J
JunLe Ye (450 points)
0 4 6
by (450 points)
Quindi i versi li devo comunque spezzare per trovare i finili giusto?
twgever (17470 points)
8 29 105
by (17.5k points)
spezzare in che senso? intendi in ES? dipende. Se parti dall'ultimo carattere del verso, devi solo "spezzare" l'ultimo, ma più che spezzarlo, lo salvi da qualche altra parte. Se invece parti dal primo carattere del verso, sì, lo devi "spezzare", ma nemmeno qua è proprio così, perchè non è che ti salvi il verso con gli spazi da qualche altra parte, non è che lo spezzi effettivamente, semplicemente ti salvi i caratteri che incontri mano mano, e se trovi una vocale seguita da una consonante, cancelli quello che hai salvato e ricominci, fino a che non arrivi all'ultimo, quindi quello che non viene "spezzato"
J
JunLe Ye (450 points)
0 4 6
by (450 points)
edited by
Se io ho questa stringa s = 'paperinoandoalmareapescare', se voglio partire dall'ultimo carattere, prima faccio L = list(s) poi

EDIT: no code please [Sterbini]
Hatlas (5340 points)
2 2 7
by (5.3k points)
Non hai bisogno di salvarla, puoi semplicemente aggiungere +1 al contatore, l'importante é salvare l'ultima.
twgever (17470 points)
8 29 105
by (17.5k points)
Ci sono tante maniere per partire dall'ultimo elemento di una lista. Puoi usare reverse, puoi fare un range che parte dall'ultimo elemento e procede con incremento -1, puoi inventare tante cose.
Hatlas (5340 points)
2 2 7
by (5.3k points)

@twgever Come si può fare a passare i testo tutto in una volta? Devi comunque ciclare ogni riga no? Cosa intendi tu nello specifico, la conversione? 

twgever (17470 points)
8 29 105
by (17.5k points)
passare il testo tutto in una volta alla funzione, quindi invece di passare la l'elemento della lista (se hai diviso il testo in liste), passi l'intera lista. Poi è elementare che dovrai ciclare per fare quello che devi fare sulle righe.
Hatlas (5340 points)
2 2 7
by (5.3k points)
edited by
Io per ogni riga del file chiamo la funzione che mi ritorna es e finale, e faccio append su due liste inizialmente vuote. Così è poco efficiente?
twgever (17470 points)
8 29 105
by (17.5k points)
Secondo me, meno efficiente di chiamare la funzione una sola volta. Considera che così, con il test più lungo la chiameresti 2571 volte in più.