2009-07-23 11 views
8

Quando si usano (pseudo) numeri casuali in Jython, sarebbe più efficiente usare il modulo casuale Python o la classe casuale di Java?Casualità in Jython

+3

Si prega di elaborare quello che consideri "efficiente". –

+2

Hai provato a misurare il tempo richiesto per ciascuno? –

risposta

9

versione di Python è molto più veloce in un semplice test sul mio Mac:

jython -m timeit -s "import random" "random.random()" 

1000000 loop, migliore di 3: 0,266 usec per loop

vs

jython -m timeit -s "import java.util.Random; random=java.util.Random()" "random.nextDouble()" 

1000000 loop, meglio di 3: 1,65 usec per loop

Jython versione 2.5b3 e Java versione 1.5.0_19.

+1

timeit, eh? Devo ricordare quello !! +1 – richq

+0

timeit è una di quelle cose 'batterie incluse' di Python. Non strettamente necessario ma così bello da avere. –

4

La classe Random di Java utilizza (e in effetti deve utilizzare le specifiche di Java) un algoritmo congruenziale lineare, mentre Python utilizza Mersenne Twister. Mersenne garantisce una qualità estremamente elevata (anche se non è cripto di qualità!) Numeri casuali e un periodo incredibilmente lungo (precisione a 53 bit, periodo 2 ** 19937-1); i generatori congruenti lineari hanno il noto issues. Se non ti importa della qualità dei numeri casuali e ti preoccupi solo della velocità, è probabile che LCG sia più veloce esattamente perché è meno sofisticato.

+1

In realtà, secondo alcuni vecchi benchmark che ho fatto nel linguaggio di programmazione D, il Mersenne Twister è più veloce, anche se usa più memoria. Questo perché il twister di Mersenne evita la divisione di quei bisogni congruenziali lineari. Gli unici buoni motivi per usare la congruenza lineare sono se hai limiti di memoria estremi o se hai bisogno solo di pochi numeri casuali e il tempo necessario per seminare il generatore è un collo di bottiglia. (Il congruenziale lineare ha uno spazio di stato più piccolo, quindi il seeding è più veloce.) – dsimcha

+0

Dove devono essere divisi i LCG? La maggior parte degli LCG usati da qualche parte usano una potenza di due come modulo (il che rende più difficile trovare parametri adatti ma è considerevolmente più veloce). – Joey

+2

Java specifica un modulo esattamente (2 ** 48) -1 e tutta l'implementazione standard Java DEVE usare esattamente questo, quindi non vedo quale "maggior parte degli LCG usati da qualche parte" abbia a che fare con il caso - java . Casual ha le sue regole molto precise. –