Ciao a tutti!<div>E&#39; la prima volta che scrivo in questa ML ma vi seguo da parecchio (non che ci capisca molto dato che sono veramente inesperta) per capire quali sono le potenzialità di questo linguaggio che mi sta dando grandi soddisfazioni nonostante (ripeto) di programmazione in generale sono quasi a digiuno.</div>

<div>Ho creato questo programmino semplicissimo che trasforma tutte le tabelle .dbf contenute in una cartella in formato csv.</div><div><br></div><div><div>import csv</div><div>import os</div><div>from dbfpy import dbf</div>

<div><br></div><div>pathin =&quot;F:\\zambrano\\scatterplot\\combine_2dt_table\\&quot;</div><div>pathout = &quot;F:\\zambrano\\scatterplot\\csv\\combine_2dt_table\\&quot;</div><div><br></div><div>for table in os.listdir(pathin):</div>

<div>    </div><div>    if table.endswith(&#39;dbf&#39;):</div><div>        </div><div>        newfile = pathout + table[:-3]+&quot;csv&quot;</div><div>        outFile = open(newfile, &#39;a&#39;)</div><div><br></div><div>

        try:</div><div>            dbfFile = dbf.Dbf(open(pathin + table,&#39;r&#39;))</div><div>            csvFile = csv.writer(open(newfile, &#39;wb&#39;))</div><div>           </div><div>            headers = range(len(dbfFile.fieldNames))</div>

<div>            allRows = []</div><div>            for row in dbfFile:</div><div>                rows = []</div><div>                for num in headers:</div><div>                    rows.append(row[num])</div><div>                allRows.append(rows)</div>

<div>                  </div><div>            csvFile.writerow(dbfFile.fieldNames)</div><div>            for row in allRows:</div><div>                csvFile.writerow(row)</div><div>            </div><div>                </div>

<div>        except Exception,e:</div><div>            print &#39;\nproblemi con &#39;+ newfile</div><div>            print e</div><div><br></div></div><div>Per alcune però mi da il seguente messaggio: &quot;unpack requires a string argument of length 8&quot;.</div>

<div>Dove ho sbagliato?</div><div>Grazie!<br><br><div name="sig_27ba94de1d" style="margin-top: 2em; margin-right: 0pt; margin-bottom: 2em; margin-left: 0pt; "><p style="color:royalblue; font: 14pt &#39;Brush Script MT&#39;, &#39;Book Antiqua&#39;, &#39;Times New Roman&#39;, Times, Georgia, serif; font-style: italic; margin: 10px 0 20px 0;">

<b style="">C</b>ynthia</p></div><div class="gmail_quote">Il giorno 12 maggio 2010 12.00,  <span dir="ltr">&lt;<a href="mailto:python-request@lists.python.it">python-request@lists.python.it</a>&gt;</span> ha scritto:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Invia le richieste di iscrizione alla lista Python all&#39;indirizzo<br>
        <a href="mailto:python@lists.python.it">python@lists.python.it</a><br>
<br>
Per iscriverti o cancellarti attraverso il web, visita<br>
        <a href="http://lists.python.it/mailman/listinfo/python" target="_blank">http://lists.python.it/mailman/listinfo/python</a><br>
oppure, via email, manda un messaggio con oggetto `help&#39; all&#39;indirizzo<br>
        <a href="mailto:python-request@lists.python.it">python-request@lists.python.it</a><br>
<br>
Puoi contattare la persona che gestisce la lista all&#39;indirizzo<br>
        <a href="mailto:python-owner@lists.python.it">python-owner@lists.python.it</a><br>
<br>
Se rispondi a questo messaggio, per favore edita la linea dell&#39;oggetto<br>
in modo che sia più utile di un semplice &quot;Re: Contenuti del digest<br>
della lista Python...&quot;<br>
<br>
<br>
Argomenti del Giorno:<br>
<br>
   1. Re: Blocco casuale nel codice (Alessandro Re)<br>
   2. Re: GIL e fork - multiprocesso - (Alessandro Agosto)<br>
<br>
<br>
----------------------------------------------------------------------<br>
<br>
Message: 1<br>
Date: Tue, 11 May 2010 19:23:02 +0200<br>
From: Alessandro Re &lt;<a href="mailto:akirosspower@gmail.com">akirosspower@gmail.com</a>&gt;<br>
Subject: Re: [Python] Blocco casuale nel codice<br>
To: Discussioni generali sul linguaggio Python<br>
        &lt;<a href="mailto:python@lists.python.it">python@lists.python.it</a>&gt;<br>
Message-ID:<br>
        &lt;<a href="mailto:AANLkTin821l9iXFuIg-3kVvr16aepb1nCilue67sAmIE@mail.gmail.com">AANLkTin821l9iXFuIg-3kVvr16aepb1nCilue67sAmIE@mail.gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=UTF-8<br>
<br>
2010/5/11 Pietro Battiston &lt;<a href="mailto:toobaz@email.it">toobaz@email.it</a>&gt;:<br>
&gt; Nella mia ignoranza di una soluzione pulita, se fossi nella tua<br>
&gt; situazione probabilmente farei un<br>
&gt;<br>
&gt; try:<br>
&gt;    chiamata_che_ogni_tanto_si_blocca()<br>
&gt; except KeyboardInterrupt:<br>
&gt;    pass<br>
&gt;<br>
&gt;<br>
&gt; A questo punto, se ad esempio il tutto gira in un terminale interattivo,<br>
&gt; potrei, quando decido che &quot;si è piantato&quot;, dare un Ctrl+C ed ispezionare<br>
&gt; le variabili che più mi aggradano.<br>
<br>
Uuuh non ci avevo pensato! :) Bella idea, spero di ricordarmela se mi<br>
capitasse un&#39;altra situazione simile...<br>
<br>
Grazie!<br>
<br>
~Ale<br>
<br>
<br>
------------------------------<br>
<br>
Message: 2<br>
Date: Wed, 12 May 2010 00:28:50 +0200<br>
From: Alessandro Agosto &lt;<a href="mailto:the.6one6@gmail.com">the.6one6@gmail.com</a>&gt;<br>
Subject: Re: [Python] GIL e fork - multiprocesso -<br>
To: Discussioni generali sul linguaggio Python<br>
        &lt;<a href="mailto:python@lists.python.it">python@lists.python.it</a>&gt;<br>
Message-ID:<br>
        &lt;<a href="mailto:AANLkTikrLJSil2-4qfG5gcOyDAPqFleo0DrxpRwtM6T4@mail.gmail.com">AANLkTikrLJSil2-4qfG5gcOyDAPqFleo0DrxpRwtM6T4@mail.gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=&quot;utf-8&quot;<br>
<br>
Il giorno 11 maggio 2010 19.16, Manlio Perillo &lt;<a href="mailto:manlio_perillo@libero.it">manlio_perillo@libero.it</a>&gt; ha<br>
scritto:<br>
<br>
&gt; Ciao<br>
&gt;<br>
Ciao Manlio!<br>
<br>
&gt; La traduzione non è corretta.<br>
&gt; Meglio &quot;limitato dalla CPU&quot;, o qualcosa di simile.<br>
&gt;<br>
<br>
 Ti ringrazio, ci speravo che intervenissi per proporre una traduzione<br>
appropriata :)<br>
<br>
Il codice che hai postato usa il threading nel modo sbagliato, perchè le<br>
&gt; due funzioni sono chiamate in modo sequenziale.<br>
&gt;<br>
 Beh devo ammettere che non ho mai usato il multithreading prima in python,<br>
e quell&#39;esempio l&#39;ho preso tal e quale a quel documento di cui sopra che<br>
parla del GIL. Ti ringrazio della segnalazione, in effetti trattandosi di<br>
multithreading, sebbene l&#39;abbia usato solo in C/C++, mi sembrava strano come<br>
applicazione, ma del resto python ha sempre qualcosa di nuovo da insegnarmi,<br>
e per questo lo trovo infinitamente attraente (per quanto possa esserlo un<br>
linguaggio di programmazione, vedi: intrigante, attrae la mia curiosità,<br>
NdT)<br>
<br>
&gt;<br>
&gt; Prima aspetti che il primo thread finisce, e quindi esegui il secondo.<br>
&gt;<br>
&gt; Uhm, adesso comunque mi hai chiarito proprio le idee, ho provato a togliere<br>
i join, a preparare i due threads insieme e quindi eseguirli<br>
contemporaneamente ma senza la join, per terminare il programma su Mac devo<br>
premere un tasto, altrimenti non mi restituisce il terminale, ma niente di<br>
chè, solo benchmarking.<br>
<br>
&gt; &gt; 3) usando la fork [3]<br>
&gt; &gt;<br>
&gt; &gt; Ho aggiunto il test per la fork in quanto creando un nuovo processo il<br>
&gt; &gt; GIL non dovrebbe dare problemi, giusto?<br>
&gt;<br>
&gt; Si.<br>
&gt;<br>
Perfetto, infatti mi ricordo che già mi consigliasti come metodo per scalare<br>
con python (qualche tempo fà) in alternativa ai thread, l&#39;uso di più<br>
processi. Dato che voglio provare a non assillare chi utilizza questo o quel<br>
programma vorrei appunto provare a creare processi alla nginx, in base al<br>
numero di workers specificati in un file di configurazione. Ma prima voglio<br>
imparare bene come e cosa è python.<br>
<br>
&gt;<br>
&gt; &gt; Beh ecco i risultati sul mio P4 3,00GHz:<br>
&gt; &gt; 1) sequenziale<br>
&gt; &gt; ----------------------<br>
&gt; &gt; real    0m35.363s<br>
&gt; &gt; user    0m34.831s<br>
&gt; &gt; sys    0m0.087s<br>
&gt; &gt; ----------------------<br>
&gt; &gt; 2) threaded<br>
&gt; &gt; ----------------------<br>
&gt; &gt; real    1m30.482s<br>
&gt; &gt; user    1m25.342s<br>
&gt; &gt; sys    0m28.125s<br>
&gt; &gt; ----------------------<br>
&gt; &gt; 3) forked<br>
&gt; &gt; ----------------------<br>
&gt; &gt; real    0m52.938s<br>
&gt; &gt; user    1m30.927s<br>
&gt; &gt; sys    0m0.395s<br>
&gt; &gt; ----------------------<br>
&gt; &gt;<br>
&gt;<br>
&gt; Io ottengo risultati molto diversi.<br>
&gt;<br>
&gt; La versione sequenziale:<br>
&gt; real    0m21.341s<br>
&gt; user    0m20.185s<br>
&gt; sys     0m0.260s<br>
&gt;<br>
&gt; La versione con threads:<br>
&gt; real    0m26.279s<br>
&gt; user    0m22.101s<br>
&gt; sys     0m5.244s<br>
&gt;<br>
&gt; La versione con i processi:<br>
&gt; real    0m13.160s<br>
&gt; user    0m10.313s<br>
&gt; sys     0m0.056s<br>
&gt;<br>
Beh la versione sequenziale mi sembra dipenda esclusivamente dalla potenza<br>
dei processori ed evidentemente i tuoi battono i miei p4 (eheh) in potenza<br>
di calcolo :p<br>
Interessante invece la versione coi threads che dimostra appunto come<br>
anzichè migliorare la situazione la peggiori, anche se nel caso di pochi<br>
secondi.<br>
<br>
Trovo grandiose le prestazioni dei processi, alla faccia di chi li critica<br>
in favore dei thread (almeno con python). Ha quasi dimezzato le prestazioni<br>
del calcolo sequenziale e praticamente la metà di quelli che usano i<br>
threads.<br>
<br>
<br>
&gt; La versione con i threads &quot;corretta&quot; (senza i due join) ha praticamente<br>
&gt; gli stessi tempi di quella postata da te.<br>
&gt;<br>
<br>
A me addirittura, come ho detto, non libera il terminale automaticamente,<br>
comunque senza i due join con un solo processore attivo mi pare (adesso non<br>
ricordo esattamente) mi sembra avesse qualche secondo in meno, ma forse<br>
complice il lancio contemporaneo dei due threads.<br>
<br>
&gt; Uso un Intel(R) Core(TM)2 CPU T7200  @ 2.00GHz<br>
&gt;<br>
&gt; Bel procio.<br>
<br>
&gt;<br>
&gt; Ciao  Manlio<br>
&gt;<br>
Ciao, grazie per il bench. Come saprai il tuo interesse è sempre ben gradito<br>
:)<br>
<br>
Buona notte.<br>
<br>
--<br>
Alessandro A.<br>
-------------- parte successiva --------------<br>
Un allegato HTML è stato rimosso...<br>
URL: <a href="http://lists.python.it/pipermail/python/attachments/20100512/6aa9afd8/attachment.html" target="_blank">http://lists.python.it/pipermail/python/attachments/20100512/6aa9afd8/attachment.html</a><br>
<br>
------------------------------<br>
<br>
_______________________________________________<br>
Python mailing list<br>
<a href="mailto:Python@lists.python.it">Python@lists.python.it</a><br>
<a href="http://lists.python.it/mailman/listinfo/python" target="_blank">http://lists.python.it/mailman/listinfo/python</a><br>
<br>
<br>
Fine di Digest di Python, Volume 51, Numero 8<br>
*********************************************<br>
</blockquote></div><br></div>