2009-07-23 8 views
8

Lors de l'utilisation de nombres (pseudo) aléatoires dans Jython, serait-il plus efficace d'utiliser le module aléatoire Python ou la classe aléatoire de Java?Randomness in Jython

+3

Veuillez préciser ce que vous considérez comme «efficace». –

+2

Avez-vous essayé de mesurer le temps requis pour chacun? –

Répondre

9

la version de Python est beaucoup plus rapide dans un test simple sur mon Mac:

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

1000000 boucles, le meilleur de 3: 0,266 microseconde par boucle

vs

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

1000000 boucles, meilleur de 3: 1,65 usec par boucle

Jython version 2.5b3 et Java version 1.5.0_19.

+1

temps, hein? Je dois me souvenir de celui-là !! +1 – richq

+0

timeit est l'une de ces choses «piles incluses» python. Pas strictement nécessaire mais tellement agréable à avoir. –

4

La classe Random de Java utilise (et doit en effet utiliser les spécifications de Java) un algorithme congruential linéaire, tandis que Python utilise Mersenne Twister. Mersenne garantit une qualité extrêmement élevée (bien que non crypto qualité!) Nombres aléatoires et une période ridiculement longue (flotteurs de précision de 53 bits, période 2 ** 19937-1); Les générateurs congruentiels linéaires ont bien connu issues. Si vous ne vous souciez pas vraiment de la qualité des nombres aléatoires, et que vous vous souciez seulement de la vitesse, LCG devrait être plus rapide car il est moins sophistiqué.

+1

En fait, selon certains anciens benchmarks que j'ai fait dans le langage de programmation D, le Mersenne Twister est plus rapide, bien qu'il utilise plus de mémoire. C'est parce que le twister Mersenne évite la division op que les besoins congruents linéaires. Les seules bonnes raisons d'utiliser la congruence linéaire sont les suivantes: si vous avez des contraintes de mémoire extrêmes ou si vous n'avez besoin que de quelques nombres aléatoires et que le temps nécessaire pour semer le générateur est un goulot d'étranglement. (La congruence linéaire a un espace d'état plus petit donc l'ensemencement est plus rapide.) – dsimcha

+0

Où les LCG ont-ils besoin d'une division? La plupart des LCG utilisés quelque part utilisent une puissance de deux comme module (ce qui rend la recherche de paramètres appropriés plus difficile mais beaucoup plus rapide). – Joey

+2

Java spécifie un module de exactement (2 ** 48) -1, et toute implémentation standard Java DOIT utiliser exactement cela, donc je ne vois pas ce que "la plupart des LCG utilisés quelque part" ont à faire avec le cas - java .Random a ses propres règles très précises. –