[Python] Problemi con modulo time e dizionari

2013-08-19 Per discussione Massimo Capanni
Salve a tutti,

mi sono imbattuto in uno strano problema e non capisco dove stia sbagliando.

In sintesi:

sto sviluppando un piccolo programma che controlla lo stato della memoria
RAM di un sistema operativo, schedulato ogni tot minuti.
Ho creato un dizionario dove ho come chiavi il tempo attuale rilasciato da
time.time() e come valore la memoria ram occupata dal sistema (valore
ottenuto con i relativi moduli di psutils).
I dati memorizzati in questo dizionario li salvo e li recupero ciclicamente
in un file creato con il modulo shelve.
E fin qui i test sono andati bene.
Poi ho pensato: voglio che ogni 100 valori registrati lo script mi scriva
l'ora e il valore massimo raggiunto della RAM in un file di testo.

Mi sono scritto così una funzione per calcolare il valore massimo in un
dizionario (forse ci sono altri metodi, ma al momento ho reinventato la
ruota per esercizio ...)

def max_dict(d):
v_max = 0
k_max = 0
for i in d.keys():
if d[i]  v_max:
v_max = d[i]
k_max = i
return k_max, v_max

e poi scrivevo i due valori ottenuti nel file di testo, convertendo la
chiave rappresentante il valore espresso in secondi con time.localtime() e
formattando i valori ottenuti.

Purtroppo mi sono reso conto che dopo l'elaborazione dei dati nella
funzione max_dict(), i valori relativi alla data e ora sono completamente
sballati, come se max_dict() operasse qualche modifica.

Così invece di ottenere data e ora di oggi ottengo:

2003115192256 1018.6 MB
2003115192256 1018.6 MB
2003115192256 1018.6 MB
2003115192256 1018.6 MB
2003115192256 1018.6 MB
200311785544 1018.7 MB
200311785544 1018.7 MB
2006730161944 1.1 GB
2006730161944 1.1 GB

Dove sto sbagliando secondo voi?



.m

.Massimo .Capanni

σπευδε βραδεως
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Problemi con modulo time e dizionari

2013-08-19 Per discussione Marco Beri
2013/8/19 Massimo Capanni massimo.capa...@gmail.com

 Dove sto sbagliando secondo voi?


Escludo che la funzione cambi i valori.

Non è che stai paragonando tra di loro delle stringhe?

 1018.6 MB  1.1 GB
True

Ciao.
Marco.

-- 
http://beri.it/ - Un blog
http://beri.it/i-miei-libri/ - Qualche libro
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Problemi con modulo time e dizionari

2013-08-19 Per discussione Massimo Capanni
le chiavi del dizionario sono i valori ritornati da time.time()
dubbio: non è che l'interprete si incasina con valori float quando sono
usati come chiavi? ...


Il giorno 19 agosto 2013 15:09, Marco Beri marcob...@gmail.com ha scritto:

 2013/8/19 Massimo Capanni massimo.capa...@gmail.com

 Dove sto sbagliando secondo voi?


 Escludo che la funzione cambi i valori.

 Non è che stai paragonando tra di loro delle stringhe?

  1018.6 MB  1.1 GB
 True

 Ciao.
 Marco.

 --
 http://beri.it/ - Un blog
 http://beri.it/i-miei-libri/ - Qualche libro


 ___
 Python mailing list
 Python@lists.python.it
 http://lists.python.it/mailman/listinfo/python


___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Problemi con modulo time e dizionari

2013-08-19 Per discussione Marco Beri
2013/8/19 Massimo Capanni massimo.capa...@gmail.com

 le chiavi del dizionario sono i valori ritornati da time.time()
 dubbio: non è che l'interprete si incasina con valori float quando sono
 usati come chiavi? ...


Per cortesia, cerca di non top-quotare. Non muore nessuno, lo so, ma mi
infastidisce. E a te costa poco.

Ad ogni modo non hai letto con attenzione quanto ho scritto. Il problema è
la riga con cui compari i valori:

if d[i]  v_max:

Se sono stringhe, non puoi confrontarle pensando che Python capisca cosa
volevi dire.

Infatti:

 un milione  un miliardo
True

Meglio di così non so spiegartelo. Fai tu un po' di fatica adesso :-)

Ciao.
Marco.

-- 
http://beri.it/ - Un blog
http://beri.it/i-miei-libri/ - Qualche libro
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Problemi con modulo time e dizionari

2013-08-19 Per discussione Marco Buttu

On 08/19/2013 03:04 PM, Massimo Capanni wrote:


Mi sono scritto così una funzione per calcolare il valore massimo in 
un dizionario (forse ci sono altri metodi, ma al momento ho 
reinventato la ruota per esercizio ...)


def max_dict(d):
v_max = 0
k_max = 0
for i in d.keys():
if d[i]  v_max:
v_max = d[i]
k_max = i
return k_max, v_max


Puoi semplicemente usare max():

 d = {1: 'uno', 3: 'tre', 2: 'due', 8: 'otto'}
 max(d), d[max(d)]
(8, 'otto')

Se non sono numeri ma stringhe che rappresentano numeri, usa ancora 
max(), passando il tipo come chiave

di conversione:

 d = {'1.22': 'uno.22', '10.33': 'dieci.33', '9.0': 'nove.0'}
 max(d)
'9.0'
 max(d, key=float)
'10.33'

Se ti serve un criterio di confronto diverso, puoi usare ancora max():

 max(d, key=lambda seq: seq[-2])
'10.33'



Purtroppo mi sono reso conto che dopo l'elaborazione dei dati nella 
funzione max_dict(), i valori relativi alla data e ora sono 
completamente sballati, come se max_dict() operasse qualche modifica.


Così invece di ottenere data e ora di oggi ottengo:

2003115192256 1018.6 MB
2003115192256 1018.6 MB
2003115192256 1018.6 MB
2003115192256 1018.6 MB
2003115192256 1018.6 MB
200311785544 1018.7 MB
200311785544 1018.7 MB
2006730161944 1.1 GB
2006730161944 1.1 GB

Dove sto sbagliando secondo voi?


Non mi pare il problema sia in max_dict(), se non per cio' che ti hanno 
gia' detto. Puoi postare il resto del codice?


--
Marco Buttu

INAF Osservatorio Astronomico di Cagliari
Loc. Poggio dei Pini, Strada 54 - 09012 Capoterra (CA) - Italy
Phone: +39 070 71180255
Email: mbu...@oa-cagliari.inaf.it

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python