[AVVISO] Software da installare (Anaconda + librerie) e comandi utili

andrea.sterbini (167800 points)
488 897 1728
asked Sep 26, 2020 in Avvisi by andrea.sterbini (167,800 points)
edited Oct 16, 2020 by andrea.sterbini

Distribuzione di Python usata nel corso: Anaconda

Per svolgere le esercitazioni, gli homework e gli esami usiamo la distribuzione di Python che potete scaricare da www.anaconda.com/download e che contiene:

  • Python 3.7 o 3.8
  • un sacco di librerie standard e/o utili
  • l'ambiente di sviluppo Spyder

Per maggiori informazioni su come installarlo vedete https://docs.anaconda.com/anaconda/install

NOTA: nella installazione di Anaconda per Windows scegliete l'opzione "Only for me"

NOTA: nel corso usiamo Spyder perchè è l'ambiente di sviluppo che userete durante l'esame (ma a casa potete usare PyCharm o altri a piacimento)

Librerie necessarie/utili per il corso

Una volta installato Anaconda potete/dovete installare queste librerie aggiuntive

Libreria A che serve Istallazione in Anaconda Prompt Come si usa
ddt Eseguire test con dati presi da file conda install -c conda-forge ddt Viene importata dai test
pytest-timeout Applicare un timeout a ciascun test conda install pytest-timeout aggiunge il parametro --timeout=<secondi> al comando pytest
stopit applicare il timeout solo all'esecuzione conda install -c conda-forge stopit viene importata dai test
pytest-profiling Esaminare i tempi di esecuzione delle diverse parti del programma conda install -c conda-forge pytest-profiling aggiunge il parametro --profile al comando pytest
Spyder Ambiente di sviluppo (editor+debugger) conda install spyder
spyder-unittest Lanciare i test da dentro Spyder conda install -c conda-forge spyder-unittest aggiunge un tab in Spyder per lanciare i test (scegliete pytest e la directory)
spyder-line-profiler Esaminare i tempi di esecuzione direttamente dentro Spyder conda install -c conda-forge spyder-line-profiler aggiunge in Spyder una voce di menu per lanciare il programma e profilarne i tempi di esecuzione (vedi https://q2a.di.uniroma1.it/16914)
radon Calcolare l'intricatezza del codice
(complessità ciclomatica massima)
conda install -c conda-forge radon radon cc -a -s --show-closures program.py
Notepad è da buttare, non lo usate non mostra i '\n' NON LO USATE
Notepad++ Editor di testo https://notepad-plus-plus.org
Wordpad OK
Beyond Compare Utilissimo per confrontare file di testo ed immagini https://www.scootersoftware.com/download.php

Per aggiornare tutte le librerie installate usate il comando (da lanciare dentro la finestra che si apre con "Anaconda Prompt")

  • conda update --all

Comandi vari

I test sono i metodi contenuti nel file test.py che hanno il nome che inizia con 'test' e vengono automaticamente eseguiti da pytest.

Per eseguire i test senza timeout usate uno dei comandi (il secondo elenca i tempi di esecuzione di ciascun test)

  • pytest test.py
  • pytest test.py -v --durations 0

Per eseguire uno specifico test invece che tutti

  • pytest -v text.py -k <parte del nome del test>

Esempio: pytest test.py -k 2_valori -v

Per eseguire i test in modo da applicare il timeout ed elencare gli N test più lenti (con T=timeout in secondi)

  • pytest -v test.py --timeout T --durations N

Per calcolare l'intricatezza (complessità ciclomatica massima) del codice

  • radon cc -a -s --show-closures program.py

Per calcolare il tempo di esecuzione complessivo del programma facendo la media su 3 run da 5 test

  • python -u -m timeit -v -v -v -v -n 5  -r 3  -s 'from test import Test' 'Test.main()'

Per esaminare nel dettaglio i tempi di esecuzione del vostro programma per vedere quale parte è più lenta (se avete installato pytest-profiling)

  • pytest -rA -v --profile test.py

NOTA: nei log dei test che produco per Q2A ho modificato leggermente l'output del plugin pytest-profiling in modo da elencare le 20 funzioni in cui i test hanno speso più tempo.
Per ottenere lo stesso output potete modificare il file .../Anaconda/lib/python3.7/site-packages/pytest_profiling.py in modo che la riga 64 sia

pstats.Stats(self.combined, stream=terminalreporter).strip_dirs().sort_stats('tottime').print_stats(20)

invece che

pstats.Stats(self.combined, stream=terminalreporter).strip_dirs().sort_stats('cumulative').print_stats(20)

Snakeviz

Per esaminare in modo interattivo il tempo speso nelle diverse funzioni potete usare il profiler e snakeviz:

  • installate snakeviz (visualizzatore di file .prof): conda install snakeviz
  • eseguite il programma col profiler: pytest --profile test_01.py
  • visualizzate i tempi di esecuzione con snakeviz: snakeviz prof/combined.prof
  • vi si apre il browser con una visualizzazione che vi permette di capire quanto tempo è speso nelle diverse parti
  • cercate la funzione da voi implementata (in genere si chiama es1) e cliccate sulla sua riga, la visualizzazione si focalizzerà sulla vostra soluzione

Usare il modulo turtle in windows: vedete https://q2a.di.uniroma1.it/16861

Python per Android

Scegliete la versione 3 di Python (la versione 2 è ormai obsoleta)

1 Answer

Light (5130 points)
23 167 229
answered Oct 4, 2020 by Light (5,130 points)
quando parla di "NOTA: nei log dei test che produco per Q2A ho modificato leggermente ecc." dobbiamo fare questa modifica che ci ha detto? non ho ben capito cosa succede se non la facciamo
G
Giuseppe01 (1500 points)
0 0 10
commented Oct 4, 2020 by Giuseppe01 (1,500 points)
edited Oct 4, 2020 by Giuseppe01
Credo che la modifica ti serva soltanto per vedere i risultati dei test ordinati così come si presentano quando, per esempio, vengono lanciati sugli homework. Effettuando quella modifica la lista viene ordinata prendendo il tempo speso all'interno delle funzioni stesse e non quello cumulativo (che invece somma i tempi di tutte le funzioni chiamate all'interno della funzione stessa). Un panoramica di quel tipo ti aiuta a capire meglio dove si trovano i colli di bottiglia nel tuo codice e potenzialmente identifica le parti che necessitano un'ottimizzazione.
andrea.sterbini (167800 points)
488 897 1728
commented Oct 5, 2020 by andrea.sterbini (167,800 points)
Esatto.              .