|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | |
|
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:
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 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]) Sto sbagliando tutto? Grazie |
|
|
|
|
|
|
#2 |
|
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 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:
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 |
|
|
|
|
|
#3 |
|
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 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 |
|
|
|
|
|
#4 |
|
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 |
|
|
|
|
|
#5 |
|
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. |
|
|
|
|
|
#6 |
|
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). |
|
|
|
|
|
#7 |
|
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. |
|
|
|
|
|
#8 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Ah, allora in generale è meglio usare lo style non pythonico. Vedi Contest 19.
Quote:
Ultima modifica di Vincenzo1968 : 03-02-2013 alle 17:28. |
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: May 2010
Messaggi: 157
|
eheheh, il C è sempre il C
|
|
|
|
|
|
#10 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
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. |
|
|
|
|
|
#11 |
|
Member
Iscritto dal: May 2010
Messaggi: 157
|
Ah, interessante!
A questo punto mi chiedo se ci sia davvero convenienza nello scrivere tutto pythonico. |
|
|
|
|
|
#12 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
|
|
|
|
|
|
|
#13 |
|
Member
Iscritto dal: May 2010
Messaggi: 157
|
Se ti sentisse cdimauro....
|
|
|
|
|
|
#14 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
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. |
|
|
|
|
|
#15 |
|
Member
Iscritto dal: May 2010
Messaggi: 157
|
Si certo, ma non volevo dire che la tua opinione non conta o vale meno della sua
|
|
|
|
|
|
#16 |
|
Senior Member
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
|
|
|
|
|
|
#17 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Quote:
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
|
|
|
|
|
|
|
#19 | |
|
Member
Iscritto dal: May 2010
Messaggi: 157
|
Tempi:
Quote:
Ultima modifica di HoldenCaulfield1987 : 03-02-2013 alle 20:21. |
|
|
|
|
|
|
#20 |
|
Senior Member
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
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:42.






















