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
risposta
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.
timeit, eh? Devo ricordare quello !! +1 – richq
timeit è una di quelle cose 'batterie incluse' di Python. Non strettamente necessario ma così bello da avere. –
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.
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
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
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. –
Si prega di elaborare quello che consideri "efficiente". –
Hai provato a misurare il tempo richiesto per ciascuno? –