[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