Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-02-2013, 11:46   #1
HoldenCaulfield1987
Member
 
Iscritto dal: May 2010
Messaggi: 157
[PYTHON] Stile pythonico ed efficienza del codice

Ciao,
ieri mi sono divertito ad implementare in python un esercizio di un corso di algoritmi.
Il testo dell'esercizio è:
Quote:
Dato un vettore di n numeri reali, progettare un algoritmo iterativo efficiente che posizioni tutti gli elementi negativi prima di tutti gli elementi positivi.
Ovviamente il vettore è stato sostituito da una lista, ma ho provato ad essere il più rispettoso possibile delle specifiche.

La mia prima soluzione é:
Codice:
lista = [1, -2, 3, -7, -10]
lista2 = [0 for i in lista]
x = 0
y = len(lista) - 1

for i in lista:
	if i < 0:
		lista2[x] = i
		x += 1
	else:
		lista2[y] = i
		y -= 1
La seconda, e molto più pythonica, è:
Codice:
lista = [1, -2, 3, -7, -10]
lista2 = [i for i in lista if i < 0]
lista2.extend([i for i in lista if i >= 0])
Ora, mi chiedevo è meglio la prima soluzione dal momento che itero solo una volta sulla lista, oppure è meglio la seconda visto che tutto il codice è più breve più pythonico anche se itero due volte?
Sto sbagliando tutto?

Grazie
HoldenCaulfield1987 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 12:28   #2
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Volevo provare a fare eseguire le due versioni per 100000 volte e prendere i tempi col comando time su Linux.

Codice:
time python nonpythonico.py
Ma, il codice mi da errore:

Codice:
vincenzo@Ubuntu12-10-AMD64:~/Contest19/Python$ time python nonpythonico.py
Traceback (most recent call last):
  File "nonpythonico.py", line 13, in <module>
    lista2[y] = i
IndexError: list assignment index out of range
Codice:
Codice:
lista = [1, -2, 3, -7, -10]
lista2 = [0 for i in lista]
x = 0
y = len(lista) - 1

k = 0
while k < 100000:
	for i in lista:
		if i < 0:
			lista2[x] = i
			x += 1
		else:
			lista2[y] = i
			y -= 1
	x = 0
	k += 1
Come lo debbo aggiustare?
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 12:34   #3
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Ci sono:



La versione non pythonica è leggermente più veloce.

Versione pythonica:
Codice:
k = 0
while k < 1000000:
	lista = [1, -2, 3, -7, -10]
	lista2 = [i for i in lista if i < 0]
	lista2.extend([i for i in lista if i >= 0])
	k += 1
Versione non pythonica:
Codice:
lista = [1, -2, 3, -7, -10]
lista2 = [0 for i in lista]
x = 0
y = len(lista) - 1

k = 0
while k < 1000000:
	for i in lista:
		if i < 0:
			lista2[x] = i
			x += 1
		else:
			lista2[y] = i
			y -= 1
	x = 0
	y = 0
	k += 1
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 13:20   #4
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Anche su Windows la versione non pythonica risulta più veloce:



Per misurare i tempi su Windows devi scaricare ptime.exe da qui:

http://www.pc-tools.net/win32/ptime/

Codice:
ptime python pythonico.py
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 13:31   #5
HoldenCaulfield1987
Member
 
Iscritto dal: May 2010
Messaggi: 157
Beh si me lo aspettavo, vista una singola iterazione contro due.
Mi chiedevo però se in ogni caso è comunque preferibile tenere sempre uno stile più pythonico anche se si perde qualcosina in tempi di esecuzione.
HoldenCaulfield1987 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 13:51   #6
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
In generale è meglio lo stile pythonico, ma se l'esercizio richiede la versione più efficiente...

Tu presentagliele tutt'e due le versioni al professore e vedi che ti dice(e facci sapere).

Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 16:22   #7
HoldenCaulfield1987
Member
 
Iscritto dal: May 2010
Messaggi: 157
No non devo presentarlo al prof.
Ho preso solo spunto da quell'esercizio per fare pratica con python.
HoldenCaulfield1987 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 16:24   #8
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Ah, allora in generale è meglio usare lo style non pythonico. Vedi Contest 19.

Quote:
Comunque io ho riscritto il codice cercando di renderlo più "pythonico", e sfruttando quello che offre il linguaggio e la libreria, anche se sono rimasto sorpreso dal risultato del tuo pezzo più "C-esco".

Ultima modifica di Vincenzo1968 : 03-02-2013 alle 16:28.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 16:43   #9
HoldenCaulfield1987
Member
 
Iscritto dal: May 2010
Messaggi: 157
eheheh, il C è sempre il C
HoldenCaulfield1987 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 17:01   #10
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da HoldenCaulfield1987 Guarda i messaggi
eheheh, il C è sempre il C
No no, non dicevo questo. Nel contest 19 abbiamo visto che la versione pythonica di cdimauro risuta più lenta della versione C-tonica(c-tonica ma sempre in python ).

Tieni conto anche che, nelle versioni che abbiamo testato qui, quelle che hai scritto tu, su windows il tempo della versione C-tonica è quasi dimezzato rispetto alla versione pythonica.

Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 18:15   #11
HoldenCaulfield1987
Member
 
Iscritto dal: May 2010
Messaggi: 157
Ah, interessante!
A questo punto mi chiedo se ci sia davvero convenienza nello scrivere tutto pythonico.
HoldenCaulfield1987 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 18:41   #12
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da HoldenCaulfield1987 Guarda i messaggi
Ah, interessante!
A questo punto mi chiedo se ci sia davvero convenienza nello scrivere tutto pythonico.
Secondo me non c'è convenienza. Io addirittura passerei a Ruby, che nell'ultima versione, la 1.9, è risultato più prestante(e su Windows molto più prestante) di python, almeno per quanto riguarda l'input-output su file.

Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 18:43   #13
HoldenCaulfield1987
Member
 
Iscritto dal: May 2010
Messaggi: 157
Se ti sentisse cdimauro....
HoldenCaulfield1987 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 18:45   #14
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da HoldenCaulfield1987 Guarda i messaggi
Se ti sentisse cdimauro....
Lascia pure che mi senta. Io esprimo le mie opinioni, mica verità assolute. Appena s'arricampa sentiamo pure la sua di opinione.
E la sua opinione equivale alla mia come a quella di chiunque altro. Non è mica il figlio della gallina bianca.

Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 18:52   #15
HoldenCaulfield1987
Member
 
Iscritto dal: May 2010
Messaggi: 157
Si certo, ma non volevo dire che la tua opinione non conta o vale meno della sua
HoldenCaulfield1987 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 18:54   #16
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Che poi, va a sapere perchè è più lento codice pythonico che C-esco...
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 18:56   #17
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da kwb Guarda i messaggi
Che poi, va a sapere perchè è più lento codice pythonico che C-esco...
Nel caso particolare di cui ci siamo occupati nel contest 19, il motivo è dovuto alla lettura/scrittura di blocchi da 4096 byte, come spiegato nei testi sui DBMS.

Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 19:01   #18
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da Vincenzo1968 Guarda i messaggi
Nel caso particolare di cui ci siamo occupati nel contest 19, il motivo è dovuto alla lettura/scrittura di blocchi da 4096 byte, come spiegato nei testi sui DBMS.

No, dico in generale... Li ho seguito!
Ma quello che non capisco è perchè scrivere codice python in stile python sembra generi codice meno efficiente rispetto a scrivere codice python in stile C
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 19:15   #19
HoldenCaulfield1987
Member
 
Iscritto dal: May 2010
Messaggi: 157
Tempi:
Quote:
time python3 pythonico.py

real 0m0.039s
user 0m0.028s
sys 0m0.008s

time python3 non_pythonico.py

real 0m0.035s
user 0m0.028s
sys 0m0.004s

-------------

time python3 pythonico.py

real 0m0.035s
user 0m0.028s
sys 0m0.004s

time python3 non_pythonico.py

real 0m0.038s
user 0m0.032s
sys 0m0.004s

--------------

time python3 pythonico.py

real 0m0.038s
user 0m0.028s
sys 0m0.008s

time python3 non_pythonico.py

real 0m0.035s
user 0m0.024s
sys 0m0.008s

Ultima modifica di HoldenCaulfield1987 : 03-02-2013 alle 19:21.
HoldenCaulfield1987 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 20:45   #20
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
È anche vero che li si tratta di spiccioli eh..
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Tutte le offerte Amazon di oggi: Google ...
Diesel alle stelle e benzina in rialzo: ...
Un bambino di 9 anni clicca su 'Promuovi...
Costruito per durare: verso un'operativi...
Il Galaxy A18 4G è ufficiale: un ...
Claude vuole leggerti anche il conto in ...
Apple inserisce l'iMac 21,5 pollici del ...
GeForce RTX 6000: design a chiplet e arr...
Questi oggetti non dovrebbero esistere, ...
Un ESP32, un modulo ECG e un bottone cuc...
Grazie a un lancio preciso, il Nancy Gra...
Centrali elettriche libere di inquinare:...
Un razzo spaziale Vega C dell'italiana A...
Mozilla: i modelli IA aperti sono solo 4...
Intel e SK hynix al tavolo per un'allean...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 13:11.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v