Torna indietro   Hardware Upgrade Forum > Software > Programmazione

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à
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 fotocamera da 200MP e il nuovo Bubble! La recensione
OPPO ha portato in Italia, dal 1° luglio 2026, Reno16 Pro: display AMOLED da 6,32 pollici a 144Hz, tripla fotocamera con sensore principale da 200 megapixel, chip Dimensity 8550 Super e batteria da 6000mAh, al prezzo di lancio di 899 euro. Lo abbiamo provato per due settimane insieme al nuovo accessorio Bubble, per capire se la formula compatta della serie regge ancora di fronte a un listino da 1099 euro
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


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...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
Costruire una VGA in casa senza un chip ...
Renault ha rifiutato due volte BYD: l'az...
Appena 9.000 imprese innovative in 25 an...
Anthropic (di nuovo) sotto accusa: chies...
HP OMEN MAX 16 con RTX 5080 e Core Ultra...
Tilly Norwood arriva al cinema: via all'...
5G slicing per le comunicazioni di emerg...
BYD SHARK, 436 CV e fino a 90 km in elet...
Quali sono i migliori produttori di tecn...
Come guardare YouTube senza pubblicit&ag...
Il telescopio spaziale europeo ESA Eucli...
Addio stampa 3D a strati: il metodo che ...
Data center ed energia green: Aruba acqu...
Windows scarica software non richiesto q...
Auto europea, Bloomberg: uno stabiliment...
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: 00:51.


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