Do you need any help?

Idee per velocizzare images.save in HW 6

p
p.carbone (900 points)
3 6 12
asked Dec 2, 2021 in HW6 by p.carbone (900 points)
Studiando un pochino la libreria png.py ho letto questo:

  ''The array is expected to be a ``numpy`` array, but it can be any
    suitable Python sequence.  For example, a list of lists can be used:
    ``png.from_array([[0, 255, 0], [255, 0, 255]], 'L')``.  The exact
    rules are: ``len(a)`` gives the first dimension, height;
    ``len(a[0])`` gives the second dimension; ``len(a[0][0])`` gives the
    third dimension, unless an exception is raised in which case a
    2-dimensional array is assumed.  It's slightly more complicated than
    that because an iterator of rows can be used, and it all still
    works.  Using an iterator allows data to be streamed efficiently."

Facendo una piccola ricerca su internet ho letto che un Numpy Array facilita operazioni matematiche avanzate e che in genere tali operazioni vengono eseguite in modo più efficiente e con meno codice di quanto sia possibile utilizzando le sequenze integrate di Python.

Essendo scontato il fatto che non possiamo importare librerie al di fuori di images(e quindi anche png), immagino che importare numpy non sia possibile, è possibile ricavarsi una numpy array fai da te da inserire nel save?

Per quanto riguarda questo: "Using an iterator allows data to be streamed efficiently."

Ho già provato a trasformare la lista in iteratore ma mi riporta l'errore Error("len(a) does not work, supply info['height'] instead."). Idee per trasformare in iteratore la lista che facciamo ?
777 views

2 Answers

Best answer
S
S3b4stian82 (2250 points)
3 6 27
answered Dec 2, 2021 by S3b4stian82 (2,250 points)
selected Dec 3, 2021 by p.carbone

Essendo scontato il fatto che non possiamo importare librerie al di fuori di images(e quindi anche png), immagino che importare numpy non sia possibile, è possibile ricavarsi una numpy array fai da te da inserire nel save?

Non puoi importare librerie esterne, ma penso nessuno ti impedisca di incollare dentro program01.py tutto il codice che vuoi.

qui c'e il repo di numpy, divertiti

James_F (4750 points)
7 14 37
commented Dec 2, 2021 by James_F (4,750 points)
il prof ci ha già ammonito una volta sul non farlo!
andrea.sterbini (172780 points)
513 935 1789
commented Dec 3, 2021 by andrea.sterbini (172,780 points)

Ma che bella idea. angry

Metto numpy tra i file di cui esaminare la somiglianza e vi scovo subito

g
g.pascasi (530 points)
1 2 4
commented Dec 3, 2021 by g.pascasi (530 points)
Quindi non è legit modificare la funzione save per ottimizzarla (senza copiare librerie)?
andrea.sterbini (172780 points)
513 935 1789
commented Dec 3, 2021 by andrea.sterbini (172,780 points)

No.......... (tutti gli anni la stessa storia crying)

Andrebbe bene solo se mi passi l'ottimizzazione così aggiorno images in modo che tutti possano usarla.

andrea.sterbini (172780 points)
513 935 1789
commented Dec 4, 2021 by andrea.sterbini (172,780 points)

Ho provato ad usare numpy e PIL per reimplementare le due funzioni save/load per caricare/salvare le immagini e i risultati sono questi:

  • la vecchia load con png.py va circa 9 volte più lenta che con PIL/numpy
  • PIL/numpy va circa 3 volte più lento che con la vecchia save con png.py
Sono 4 righe di codice ma non migliorano i tempi di salvataggio (per ora)
G
Gian-duiotto (630 points)
2 4 8
answered Dec 2, 2021 by Gian-duiotto (630 points)
Se vuoi ottenere il bonus efficenza e stai cercando una soluzione per velocizzare il programma non considerare images.save come punto di riferimento. Nel senso non c'è bisogno di velocizzarlo :)
p
p.carbone (900 points)
3 6 12
commented Dec 9, 2021 by p.carbone (900 points)

controlla il primo della leaderboard..., il suo codice è poco efficiente e impiega 200 ms quando il mio ne impiega 30 su mat-16-25, il trucchetto che ha usato è stato quello di ridurre il save andando a inserire (invece che tuple contenenti i 3 colori rgb) direttamente tuple unite insieme con tutti i colori dentro..., ho modificato il mio riducendo il save a mia volta ed ora è molto più veloce, incredibile che ancora non si è capito questo concetto, non è la VM il problema, il tempo che impiega  (il margine di imprecisione) è costante in base al tempo complessivo dell'esercizio, è ovvio quindi che se metti un save che impiega il 90% del tempo il margine si ingrandisce andando a sovrastare e mascherare l'efficienza di un esercizio che è 1 ordine (quasi 2) di grandezza più piccolo, ora che hai modo di vederlo controlla i codici e magari capisci che intendo. Mi dispiace solo che non ha scritto qui sotto il metodo per migliorare il save visto che sto post l'anno letto in 400 e quindi probabilmente anche lui.(chissà se ha preso spunto proprio da questo). Morale della favola save si poteva migliorare, ed è stato fatto, ovviamente di nascostofrown, e ovviamente è stato l'elemento più importante per migliorare l'efficienza... 

Fulminetor5000 (400 points)
1 2 5
commented Dec 9, 2021 by Fulminetor5000 (400 points)
Come precedentemente argomentato, migliorando la conta del tempo sulla vm o cambiando metodo di conteggio della velocità, non si hanno problemi a calcolare in modo corretto i tempi con il save originale.

Nel caso specifico che hai detto tu, la funzione save non mi sembra sia stata modificata, quindi ad occhio, è lecito farlo ed è anche un'ottima intuizione.

Detto questo, per valutare la bravura in una sfida bisogna rispettare delle precise condizioni, cambiando le condizioni cambia la sfida.

Se vuoi dimostrare chi corre più veloce, i 100 metri vanno fatti a piedi;
Se vuoi dimostrare chi arriva prima, i 100 metri puoi farli come vuoi.

Se la funzione save non va modificata e lo fai lo stesso,
non "vince" l'algoritmo che ha creato più velocemente l'immagine utilizzando la funzione save (cioè lo scopo dell'esercizio), ma quello che ha generato più velocemente l'immagine.

Praticamente è come aver svolto un altro esercizio.

Visto che in questa leaderboard vince la prima metà, fare punteggi particolarmente buoni è solo soddisfazione personale (io nemmeno sono iscritto al corso, li faccio solo per questo);
Non so quanta soddisfazione personale si possa avere barando.
andrea.sterbini (172780 points)
513 935 1789
commented Dec 9, 2021 by andrea.sterbini (172,780 points)
Grazie per le info.

Scopo dell'esercizio non è ottimizzare il salvataggio.

Mi sa che qualcuno fallirà i test segreti
andrea.sterbini (172780 points)
513 935 1789
commented Dec 9, 2021 by andrea.sterbini (172,780 points)
edited Dec 9, 2021 by andrea.sterbini

Vedete, secondo me vincere sporco non è rispettoso dei colleghi.
Se vedete spazio per migliorare il macchinario io sono ben felice di accettare i vostri suggerimenti.
Se aveste detto in tempo che c'è un modo di rendere più veloce caricamento e/o salvataggio delle immagini (come avevo chiesto qualche post fa) tutti ne avrebbero tratto giovamento.

Ora siamo dopo la scadenza ed il codice consegnato è quello che è, per cui qualcuno dovrà rifare lo HW6 (che per voi bravi è una passeggiata).

Per dimostrare che vi ascolto apro una Categoria BUG BOUNTY / IMPROVEMENTS in cui potete suggerire miglioramenti dei test e delle librerie usate (potrei benissimo passare ad usare PIL e numpy l'anno prossimo, ad esempio). Tutti i miglioramenti che verranno accolti verranno premiati.

iacopomasi (2780 points)
13 19 41
commented Dec 10, 2021 by iacopomasi (2,780 points)

Si fra l'altro nella mie lezione ho sottolineato di NON modificare i moduli di base per velocizzare l'esercizio, perchè sentivo parlare di modifiche durante la lezione.
Va bene apportare modifiche ai moduli di base ma "fuori" dall' HW nel thread specificato dal Prof. Sterbini.