Nokioteca [Nokia] Forum: [pys60] Tips & Tricks - Nokioteca [Nokia] Forum

Salta al contenuto

Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione

[pys60] Tips & Tricks sempre utili!

#1 L   memoryn70 

  • Millennium Member
  • Gruppo: Developer
  • Messaggi: 2112
  • Iscritto: 02 maggio 2007
  • Cellulare:Nokia N70
  • Firmware:5.0609.2.0.1

Inviato 14 luglio 2008 - 10:43

Siccome ormai in PyS60 succedo spesso i soliti problemi, scrivo qui una "lista" di consigli e trucchetti x programmare al meglio B)
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 B)):
-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

0

#2 L   ..::DoS::.. 

  • Millennium Member
  • PuntoPuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 1673
  • Iscritto: 03 aprile 2007
  • Località:Latina
  • Cellulare:iPhone 4
  • Firmware:4.3.1

Inviato 14 luglio 2008 - 12:59

grande memory si potrebbe implementare!!
0

#3 L   overminder 

  • Advanced Member
  • PuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 38
  • Iscritto: 01 luglio 2008

Inviato 08 febbraio 2010 - 18:21

Ciao leggevo il tuo molto interessante...

sto realizzando un piccolo software che per altro funziona gia' anche se ha bisogno di piccole implementazioni per renderlo migliore, che monitorizza la corrente di casa e quando manca manda un sms a chi voglio io. Dato che e' un eterno ciclo e ha molti print per scrivere quello che sta facendo, ho capito giusto o i print sono una delle cause di crash?
0

#4 L   memoryn70 

  • Millennium Member
  • Gruppo: Developer
  • Messaggi: 2112
  • Iscritto: 02 maggio 2007
  • Cellulare:Nokia N70
  • Firmware:5.0609.2.0.1

Inviato 15 febbraio 2010 - 15:30

Visualizza Messaggioverminder, il 08/02/2010 - 18:21, ha scritto:

Ciao leggevo il tuo molto interessante...

sto realizzando un piccolo software che per altro funziona gia' anche se ha bisogno di piccole implementazioni per renderlo migliore, che monitorizza la corrente di casa e quando manca manda un sms a chi voglio io. Dato che e' un eterno ciclo e ha molti print per scrivere quello che sta facendo, ho capito giusto o i print sono una delle cause di crash?


Eh si potrebbero darti problemi...ti consiglio ti scrivere su canvas oppure di cancellare tutto prima di fare i print! Tipo appuifw.app.body.clear() #Non mi ricordo se clear o altro, vedi appuifw.Text
0

Condividi questa discussione:


Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione