Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
HONOR Magic V6 è arrivato in Italia a 2.299,90 euro con una promessa precisa: unire 4 mm di spessore da aperto (8,75 mm chiuso nel modello White, 9 mm negli altri colori) a una batteria da 6.660 mAh, la più capiente mai vista su un pieghevole. Lo abbiamo usato per oltre una settimana in versione Red 16/512 GB per capire se lo Snapdragon 8 Elite Gen 5 tiene testa alla concorrenza anche fuori dai benchmark ufficiali
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7 punta su un display ampio e fluido, una batteria capace di accompagnare l'uso quotidiano senza ansie da ricarica e un prezzo accessibile, a partire da 179,90 euro per la versione con 64 GB di storage. Lo Snapdragon 6s 4G Gen 2 e i 4 GB di RAM della configurazione più diffusa frenano però chi cerca reattività e multitasking spinto: ecco il bilancio dopo due settimane di prova diretta
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
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


Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere? Recensione HONOR Magic V6: spessore record e sup...
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni Redmi Pad 2 9.7: ampio display, economico e peso...
Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Il presidente di Sony ha venduto il 56,5...
Nuova vulnerabilità per il kernel...
Fallout Stagione 2: 10 le nomination agl...
IQM porterà il quantum computer L...
2 MB di memoria RAM sono sufficienti per...
Incendio a Bovisa: cosa succede quando u...
AMD lancia 11 nuovi processori tra Ryzen...
IBM tra IA, sovranità digitale e ...
Blocco dei social sotto i 14 anni. A chi...
Nothing Ear (3a): la recensione delle cu...
DENZA BAO 5, il primo SUV del marchio BY...
Addio cavi in auto: Ottocast a IFA con C...
HONOR "Summer Essentials": l'e...
IBM fa la cura dimagrante ai mainframe z...
DENZA Z, la supercar con 3 motori elettr...
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: 20:59.


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