Inizio con questi ma poi ne scriverò altri (potete anche aggiungerli voi o suggerirli)
Saranno cose banali per chi è esperto ovvio, ma possono essere utili questi consigli ad un newbie!
Python Vs Velocità!
Il python è un linguaggio molto potente ma contemporaneamente anche adatto a meno esperti. Rispetto ad esempio al C++ Symbian, il py è banale!
Pensiamo ad un banale hello world in console:
py: print 'Ciao mondo'
c++: se voglio terminare la guida,meglio che evito!Ahahah
C'è da dire però che le cose migliori hanno anche alcuni svantaggi (in parte risolvibili
-occupa abbastanza ram (problemi in sistemi con poca ram,su N70 o PC no problem );
-esecuzione lenta di alcuni oggetti;
-scrittura file lenta (vediamo poi il trucco
In parte queste rotture si possono evitare seguendo questi trucchi:
-"occupa abbastanza ram e si avvia lentamente",si ma si può alleggerire se si programma bene e si seguono alcune cose!
Consigli:
-strutturare il programma in classi possibilmente e inizializzarle solo quando servono;
-pulire variabili 'pesanti' a fine uso con del (image object,stringhe lunghe,istanze classi inutilizzate,moduli non più utilizzati,liste con molti oggetti pesanti,...).
Il python fa cmq sempre 1 clean ogni tanto a termine funzione. Ma meglio fare noi.
-COMPILARE il sorgente .py in .pyc: si risparmia ram (anche notevole) e velocità di avvio.
-scrivere il codice in maniera efficiente.
-"scrittura file lenta",ma non necessariamente;) Infatti esiste un trucco!
Soluzione:
Se volete velocizzare la scrittura più del 115-130% del tempo impiegato,usate questo:
f=open(file,'w',500) dove 500 è il buffer di scrittura: di default è 1(sarebbe quello di sistema ahahaha).
Si può applicare anche al metodo open di codecs
f=codecs.open(file,'w','utf8',buffering=500).
Potete aumentare il buffer a piacere.
Con lo script mio che va a scrivere 40kb (circa 700byte x ciclo) normalmente ci mette 90-100 secondi mentre con questo trucco solo 12!!Bel risparmio,eh?
Ho controllato e scrive senza nessun problema...Bisogna però non dimenticare di utilizzare a fine scrittura i metodi f.close() o f.flush()(se si deve ancora scrivere poi): un arresto anomalo porterebbe alla perdita dei dati non ancora scritti definitivamente!
-"esecuzione lenta di alcuni oggetti"
Beh qui si nota solo se si utilizzano dei cicli while-for lunghi e magari con calcoli matematici
Soluzioni:
-COMPILARE il sorgente .py in .pyc: si risparmia ram e velocità di avvio script (da poco aiuto però in questo caso)
-scrivere il codice in maniera efficiente (gestione errori try/except in modo efficente,calcoli + semplificati possibili...)
-evitare situazioni complicate
Python tips&tricks
1)Cicli for-while lunghi & crash applicazione: succede ad esempio se un ciclo for nn ha sleep e deve fare cose abbastanza lunghe.
Si può rimediare mettendo e32.ao_yield() o e32.ao_sleep(sec) se vogliamo dargli 1 pò di sosta a fine ciclo
Con questo avremo anche un risparmio della batteria.
esempi:
for obj in list: err=do.some_complex(obj) print err #crash spesso con i print e32.ao_yield() #la soluzione! Con questo diamo un radiatore al ciclo :)
2)Codifiche stringhe: un inferno x il serpente! Soprattutto perchè come ascii interpreta solo i primi 128 byte (motivo?Boh...) e gli accenti sono dopo grr..
L'unicode sarebbe sempre da usare,anche nei file.Ma ha un piccolo svantaggio: occupa 2byte+2*caratteri,in parole povere il doppio. (è: \xe8 in ascii e \xe8\x00 in utf16 (unicode))
Si possono quindi usare altre codifiche: utf8,latin-1,iso...Per l'italiano andrebbero bene tutte
ma in certi casi solo alcune vanno bene.L'unica è provare!
Conviene fare cosi:
def cod(s):
return s.decode('utf8')
dir=cod(path)3)L'icona di un applicazione python standalone non si vede nel taskmanager?
Oppure sia il logo operatore che l'ora e altro diventano "sporchi" in standby?
Dipende dalla partenza!
Per risolvere, bisogna far partire la prima funzione (che contine un ciclo while o un e32.Ao_lock) con 1 timer:
#
app_timer=e32.Ao_timer()
...
app_timer.after(0,funz_init)
del app_timer
#
Nella funzione di init si metterà anche:
#al di fuori lock=e32.Ao_lock()
lock.wait()
4)Ricordarsi sempre di mettere l'istanza canvas e audio.Sound come globale,altrimenti insorgono problemi.
'name canv is not defined',anche se è già globale, capita spesso.
5)Volete sapere l'errore che si è generato in un try/except? Facile!
try: e32.ciao()
except Exception, e: print str(e)
e sarà in questo caso:
'module' object has no attribute 'ciao'
6)E per generare errori? Si fa cosi:
raise #genera errore
raise SystemError,"il sistema e' andato a riposo" #con tipo e descrizione,ritorna:
>>> raise SystemError,"il sistema e' andato a riposo"
Traceback (most recent call last):
File "<console>", line 1, in ?
SystemError: il sistema e' andato a riposo
>>>
I tipi possono essere: SystemError,ZeroDivisonError,AssertError,IOError,TypeError,OverflowError...
Può essere utile questo metodo quando si creano delle estensioni.
7)Scrivere-leggere file con codifica? Utilizzare il modulo codecs:
codecs.open(file,'w' o 'r','utf16') #unicode , auto scrive i 2 byte iniziali ff fe e i caratteri a 2 byte.
La migliore cosa da fare se non si conosce la codifica adeguata x aprire un file di testo, è creare una lista
con varie codifiche e andare a tentativi:
#QUesta è la funzione che apre i testi in WinFile, riadattata da utilizzare senza classe:
def load(file):
if file == None:
raise IOError('Nessun file!')
f = open(file, 'r')
text = f.read()
f.close()
if text.startswith('\xff\xfe') or text.startswith('\xfe\xff'): #Se è unicode
enc = 'utf16' #Codifica x l'unicode
text = text.decode(enc)
else:
for enc in ['ascii','utf8', 'latin1','iso-8859-1']:
try:
text = text.decode(enc).replace(u"\x00","") #Decodifichiamo e togliamo eventuali byte nulli
break
except UnicodeError:
pass
else:
raise UnicodeError
line_sep=u'\u2029' #Mettiamo il carattere capo linea unicode x evitare quadratini sul canvas
return text.replace(u'\r\n', u'\u2029').replace(u'\n', u'\u2029'), enc , len(text) , line_sep
#8)Si possono creare dei mini thread semplicemente con un ao_timer.
Ad esempio si può far partire un ciclo che continua ad aggiornare l'ora in un punto dello schermo e dopo la partenza eseguire altre funzioni.
Funziona come descritto nel punto 3)
Messaggio modificato da memoryn70 il 14 luglio 2008 - 14:11

Aiuto















Pubblicità