Torna indietro   Hardware Upgrade Forum > Software > Programmazione

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
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'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
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


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 ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La prima missione orbitale del razzo spa...
Servizi in streaming sempre più c...
Anteprima della Leapmotor B03X: inizia l...
Anthropic accusa la Cina: Claude utilizz...
I satelliti Rassvet (Starlink russo) di ...
Un agente IA ha risolto un problema su W...
Cina: la CMSA potrebbe cambiare parte de...
68 mensilità di bonus per i dipen...
Rocket Lab ha fatto ricorso contro la de...
Nutanix rende disponibile Azure Virtual ...
Il padrino del deep learning avverte: gl...
Il finto avviso "iPhone Storage is Full"...
Dietrofront in Cina, addio touchscreen p...
Un piccolo accessorio trasforma lo smart...
Dopo 370 anni il Cyphral Distich non è p...
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: 22:13.


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