2015-01-02 31 views
16

Qual è la differenza tra random.normalvariate() e random.gauss()?Qual è la differenza tra random.normalvariate() e random.gauss() in python?

Prendono gli stessi parametri e restituiscono lo stesso valore, eseguendo essenzialmente la stessa funzione.

Ho capito da un previous answer che random.gauss() non è thread safe, ma cosa significa questo in questo contesto? Perché un programmatore dovrebbe preoccuparsi di questo? In alternativa, perché era sia una versione thread safe che non thread-thread inclusa in "random" di Python?

risposta

7

I frammenti di codice sicuri per il thread devono tenere conto del possibile race conditions durante l'esecuzione. Questo introduce overhead come risultato di synchronization schemes come mutex, semafori, ecc.

Tuttavia, se si sta scrivendo codice non rientranti, in genere non si verificano condizioni di gara, il che significa essenzialmente che è possibile scrivere codice che viene eseguito un po 'più veloce. Immagino che questo sia il motivo per cui è stato introdotto random.gauss(), dal momento che il documento python dice che è più veloce della versione thread-safe.

1

Non ne sono completamente sicuro, ma la Documentazione di Python dice che random.gauss è leggermente più veloce, quindi se sei a posto con safe non thread puoi andare un po 'più veloce.

0

In un sistema multi-thread, chiamando random.normalvariate due volte molto rapida successione causerà il codice interno di random.normalvariate da eseguire due volte, potenzialmente prima della prima chiamata ha avuto la possibilità di tornare. Le variabili interne potrebbero non essere ripristinate prima della seconda, il che potrebbe causare errori nell'uscita della funzione.

Le chiamate successive a random.gauss devono invece attendere che le chiamate precedenti vengano restituite prima di essere chiamate automaticamente.

Il vantaggio con random.normalvariate è quindi che è più veloce, ma può produrre un output errato.

+2

Questo è un po 'di confusione. Hai confuso la sicurezza del thread di random.gauss e random.normalvariate? –

13

Questa è una domanda interessante. In generale, il modo migliore per conoscere la differenza tra due implementazioni pitone è quello di ispezionare il codice da soli:

import inspect, random 
str_gauss = inspect.getsource(random.gauss) 
str_nv=inspect.getsource(random.normalvariate) 

e poi stampare ciascuna delle stringhe per vedere come le fonti sono diverse. Una rapida occhiata ai codici mostra che non solo si comportano diversamente dal multithreading, ma anche che gli algoritmi non sono gli stessi; per esempio, normalvariate utilizza qualcosa chiamato Kinderman e Monahan metodo , secondo le seguenti osservazioni in str_nv:

# Uses Kinderman and Monahan method. Reference: Kinderman, 
# A.J. and Monahan, J.F., "Computer generation of random 
# variables using the ratio of uniform deviates", ACM Trans 
# Math Software, 3, (1977), pp257-260. 
+0

È triste che questo tipo di documentazione non possa essere trovato nella presunta documentazione. Qualche idea per quale motivo potrebbe essere? – hkBst