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

Do you need help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2023-24 loggatevi e attivatelo nella vostra pagina dei corsi preferiti. A quel punto il corso appare nel menù personale cliccando sul proprio avatar. Per i materiali degli anni precedenti seguite lo stesso metodo.

To join the Programming/Lab 2023-24 course, log-on and select it on the my courses page. It will appear on the personal menu of your avatar. For earlier years use the same method.

Ottimizzazione algoritmo e metodologia

o
orlandoalessio1998 (7730 points)
7 24 36
in Programmare in Python by (7.7k points)
Salve, premetto che non sono completamente un neofita e che la base di una buona programmazione la conosco;
Il mio quesito riguarda, come da titolo, l'ottimizzazione di un algoritmo e il metodo tramite il quale effettuarla.

Normalmente riesco a trovare i casi limite di ogni programma che scrivo e riesco, spesso a eliminare parti di codice che all'inzio consideravo necessarie ma che alla fine risultavano superflue ai fini dei risultati... il mio dilemma nasce però dal fatto che, capita di dover creare algoritmi cosi "ottimizzati" che effettuare una mera scrematura del codice scritto non basta ma bisogna entrare nei piccoli cavilli del codice, e a volte cambiarlo totalmente. La mia domanda è 'Qual'è la procedura da effettuare di solito? Come agireste voi? (riferito sia ai piu esperti che ai piu novizi nonchè hai prof che, sicuramente, avranno piu esperienza di molti di noi messi insieme) Che consigli riuscite a darmi?
1.3k views
closed

2 Answers

Best answer
LeonardoEmili (35740 points)
14 65 155
by (35.7k points)
selected by

Buongiorno,

dovresti cercare di ridurre il tutto a un problema matematico in quanto l'elaboratore lavora in questa maniera. Personalmente preferisco prima concentrarmi sulla stesura di un programma funzionale e solo in seguito passare alle ottimizzazioni, anche perché queste spesso rimangono nascoste a una prima vista. Infatti andando poi a rileggere e a testare più volte il codice ti accorgi poi delle differenze (a volte infinitesimali) che stanno tra la scelta di un metodo piuttosto che un altro.

Quello che ti consiglio è di andarti a studiare i meccanismi intrinsechi nei comandi che scegli di utilizzare. Ti faccio un esempio: in Python 2.x la funzione range() era diversa da come è in Python 3.x infatti ora esso è definito come un generatore, che aumenta i numeri in progressivo sovrascrivendo il dato precedente, mentre prima andava a creare una lista di numeri che andavano dal numero "0" al numero n-1. C'è stato un notevole incremento di prestazioni con questo update, nonostante ciò ho potuto constatare che iterare attraverso un ciclo che utilizza il range rimane ancora più lento rispetto al ciclo che itera direttamente sui singoli elementi, per ovvi motivi.

Ti consiglio inoltre di ragionare sull'uso delle strutture dati da te scelte perché alcune offrono dei vantaggi considerevoli che invece in altri casi risultano scomode o addirittura inutili. Introduco per completezza anche il discorso dell'intricatezza vs velocità di esecuzione , infatti puntando ad avere una velocità maggiore e quindi e tempi di esecuzione minori spesso si sceglie di utilizzare delle condizioni che eseguono determinate operazioni solo e soltano se vengono rispettate determinate condizioni. In questo caso ti consiglio ovviamente di utilizzarle se vuoi rendere il tuo programma più performante, ricordati però che questo "controllo a postumi" che facciamo fare alla macchina alle volte può esser evitato facendo un controllo a monte dell'operazione e diminuendo ancora di più le operazioni di calcolo che chiediamo al nostro computer. 

Ti auguro una buona giornata,

Leonardo Emili

by (9.9k points)
Partendo dal fatto che la ottimizzazione prematura è il male, io in questi homework (ma in generale) ho seguito un "workflow" ben preciso: parto dall'algoritmo più semplice e stupido, magari anche molto lento, dopo di che ottimizzo una piccola parte, verifico il risultato, e ripeto il ciclo. Alla fine verrà un codice più complesso da leggere, però se ben documentato (usate i commenti!) può essere godibile anche ad altre persone.