2009-07-23 16 views
8

Al usar números (pseudo) aleatorios en Jython, ¿sería más eficiente usar el módulo aleatorio de Python o la clase aleatoria de Java?Aleatoriedad en Jython

+3

Por favor, elabore lo que considere "eficiente". –

+2

¿Has probado medir el tiempo requerido para cada uno? –

Respuesta

9

la versión de Python es mucho más rápido en una prueba sencilla en mi Mac:

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

1.000.000 bucles, mejor de 3: 0,266 USEC por lazo

vs

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

1000000 bucles, lo mejor de 3: 1.65 usec por ciclo

Jython versión 2.5b3 y Java versión 1.5.0_19.

+1

timeit, ¿eh? Debo recordar eso !! +1 – richq

+0

timeit es una de esas cosas de 'baterías incluidas' de python. No es estrictamente necesario, pero es muy bueno tenerlo. –

4

La clase Random de Java usa (y de hecho debe usar las especificaciones de Java) un algoritmo congruente lineal, mientras que Python usa Mersenne Twister. Mersenne garantiza una calidad extremadamente alta (aunque no crypto quality!) Números aleatorios y un período ridículamente largo (flotadores de precisión de 53 bits, período 2 ** 19937-1); Los generadores congruenciales lineales tienen el conocido issues. Si realmente no te importa la calidad de los números aleatorios, y solo te importa la velocidad, es probable que LCG sea más rápido exactamente porque es menos sofisticado.

+1

En realidad, según algunos puntos de referencia anteriores que hice en el lenguaje de programación D, el Mersenne Twister es más rápido, aunque usa más memoria. Esto se debe a que el tornado de Mersenne evita la división de las necesidades congruentes lineales. Las únicas buenas razones para usar congruencia lineal son si tiene limitaciones extremas de memoria o si solo necesita unos pocos números aleatorios y el tiempo que lleva generar el generador es un cuello de botella. (Linear congruente tiene un espacio de estado más pequeño para que la siembra sea más rápida). – dsimcha

+0

¿Dónde los LCG necesitan una división? La mayoría de los LCG que se utilizan en algún lugar usan una potencia de dos como su módulo (lo que hace que encontrar parámetros adecuados sea más difícil, pero es considerablemente más rápido). – Joey

+2

Java especifica un módulo de exactamente (2 ** 48) -1, y todas las implementaciones estándar de Java DEBEN usar exactamente eso, así que no veo qué tienen que ver "la mayoría de los LCG que se usan en algún lado" con el caso - java .Random tiene sus propias reglas muy precisas. –