Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Con la prima rete 5G Standalone attiva in Italia, WINDTRE compie un passo decisivo verso un modello di connettività intelligente che abilita scenari avanzati per imprese e pubbliche amministrazioni, trasformando la rete da infrastruttura a piattaforma per servizi a valore aggiunto
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro punta a diventare uno dei riferimenti assoluti nel segmento dei camera phone di fascia alta. Con un teleobiettivo Hasselblad da 200 MP, una batteria al silicio-carbonio da 7500 mAh e un display da 6,78 pollici con cornici ultra ridotte, il nuovo flagship non teme confronti con la concorrenza, e non solo nel comparto fotografico mobile. La dotazione tecnica include il processore MediaTek Dimensity 9500, certificazione IP69 e un sistema di ricarica rapida a 80W
DJI Romo, il robot aspirapolvere tutto trasparente
DJI Romo, il robot aspirapolvere tutto trasparente
Anche DJI entra nel panorama delle aziende che propongono una soluzione per la pulizia di casa, facendo leva sulla propria esperienza legata alla mappatura degli ambienti e all'evitamento di ostacoli maturata nel mondo dei droni. Romo è un robot preciso ed efficace, dal design decisamente originale e unico ma che richiede per questo un costo d'acquisto molto elevato
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-02-2013, 12: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, 13: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, 13: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, 14: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, 14: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, 14: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, 17: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, 17: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 17:28.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 17: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, 18: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, 19: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, 19: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, 19: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, 19: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, 19: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, 19: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, 19: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, 20: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, 20: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 20:21.
HoldenCaulfield1987 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 21: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


Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
DJI Romo, il robot aspirapolvere tutto trasparente DJI Romo, il robot aspirapolvere tutto trasparen...
DJI Osmo Nano: la piccola fotocamera alla prova sul campo DJI Osmo Nano: la piccola fotocamera alla prova ...
FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Samsung lancia il Team Galaxy Italia per...
Magic Leap: indistinguibili dai normali ...
Aruba Cloud: trasparenza sui costi e str...
Quando il cloud si blocca e resti al fre...
Integrare per competere, la sfida digita...
Leggenda del rally e modernità: S...
La Python Software Foundation rinuncia a...
Full HD e QLED, è in offerta un TV da 32...
Honda ha rilasciato un nuovo video sul p...
Resident Evil Requiem: arriva su Switch ...
Marshall Acton III in promo su Amazon in...
2 portatili che costano poco ma vanno be...
Smartphone potenti sotto i 300€: ecco i ...
28 Offerte Amazon da non perdere: smartp...
X torna a crescere in Europa: +7 milioni...
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: 17:42.


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