[Python] Incongruenze durante il processing
Daniele Varrazzo
piro a develer.com
Gio 16 Ott 2008 22:29:14 CEST
On Thu, 16 Oct 2008 22:13:55 +0200, michele a nectarine.it wrote:
> Ciao,
> ho scritto un encoder in python e in Java; fanno le stesse identiche
> computazioni, e, se alimentati con lo stesso input, non forniscono lo
> stesso output.
>
> In allegato trovate sia il codice Java che quello python.
> Per iniziare, vi serve un file di input:
> $ dd if=/dev/urandom of=test.img bs=1048576 count=1
>
> Come potete vedere il codice è molto corto, ma i due programmi fanno
> esattamente la stessa cosa (la bitlist è uguale, quindi entrambi
> selezionano gli stessi blocchi in input e ne fanno lo xor - potete
> vedere che i blocchi selezionati corrispondono sempre perché ogni
> volta che un blocco viene selezionato ne stampa l'hash).
> Qui viene la parte di incongruenza: avendo gli stessi input, perché i
> due programmi producono due output diversi? Potete vedere questo
> dall'hash del blocco risultante (random_block) che viene stampato alla
> fine del programma.
> In Java ha un valore che è totalmente diverso da quello in python.
> Perché?
> Operando sullo stesso input e facendo le stesse operazioni, dovrebbero
> restituire lo stesso output.
>
> Dove sbaglio?
Non ho provato perché non ho voglia di ricordarmi come si compila il Java,
ma, avevo notato anche ieri, che inizializzi random_block con una lista di
'0', ovvero con una lista di "48", mentre probabilmente avresti voluto (e
penso che la versione in Java faccia) inizializzarla con dei valori zero:
In [1]: ord('0')
Out[1]: 48
In [2]: ord('\0')
Out[2]: 0
Prova se con "random_block = ['\0']*blocksize" ottieni il risultato
desiderato.
Non aspettarti una velocità mostruosa da questo codice. Ieri mi stavo
divertendo a micro-ottimizzarlo un po', l'avevo fatto scendere da 20 a 9
secondi... ma ti hanno già dato la risposta migliore: se usi un pacchetto
di calcolo matriciale (numpy è il più recente) il risultato sarà di un
ordine di grandezza o due più veloce.
--
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com
Maggiori informazioni sulla lista
Python