2009-07-23 7 views
8

Używając (pseudo) losowych liczb w Jythonie, czy bardziej efektywne byłoby użycie losowego modułu Pythona lub losowej klasy Javy?Losowość w Jythonie

+3

Proszę wyjaśnić, co uważasz za "skuteczne". –

+2

Czy próbowałeś mierzyć czas wymagany do każdego? –

Odpowiedz

9

wersja Pythona jest znacznie szybszy w prostym teście na moim Mac:

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

1000000 pętli, najlepiej 3: 0,266 usec za pętlą

vs

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

1000000 pętli, najlepiej z 3: 1.65 użycie w pętli

Jython wersja 2.5b3 i Java wersja 1.5.0_19.

+1

timeit, co nie? Muszę to zapamiętać !! +1 – richq

+0

timeit to jedna z tych rzeczy "w bateriach". Nie jest to bezwzględnie konieczne, ale bardzo przyjemne. –

4

Jawna klasa losowa używa (i rzeczywiście musi używać specyfikacji Javy) liniowy algorytm kongruencji, podczas gdy Python używa Mersenne Twister. Mersenne gwarantuje ekstremalnie wysoką jakość (choć nie jest to jakość: crypto!) Liczb losowych i absurdalnie długi okres (53-bitowe precyzyjne pływaki, okres 2 ** 19937-1); Generatory liniowe kongruencji mają dobrze znany issues. Jeśli nie zależy ci na jakości liczb losowych i zależy tylko od prędkości, LCG będzie prawdopodobnie szybsze właśnie dlatego, że jest mniej wyrafinowane.

+1

W rzeczywistości, według niektórych starych testów, które zrobiłem w języku programowania D, Mersenne Twister jest szybszy, chociaż zużywa więcej pamięci. Dzieje się tak dlatego, że tornado Mersenne unika podziału na liniowe potrzeby kongregacji. Jedynym dobrym powodem do zastosowania konwencji liniowej są ekstremalne ograniczenia pamięci lub jeśli potrzebujesz tylko kilku liczb losowych, a czas potrzebny do zaszczepienia generatora jest wąskim gardłem. (Liniowy kongruencja ma mniejszą przestrzeń stanów, więc obsiewanie jest szybsze.) – dsimcha

+0

Gdzie LCG potrzebują podziału? Większość LCG, które są używane gdzieś, używa mocy dwóch jako ich modułu (co sprawia, że ​​znalezienie odpowiednich parametrów jest trudniejsze, ale jest znacznie szybsze). – Joey

+2

Java określa moduł dokładnie (2 ** 48) -1, a cała standardowa implementacja Java MUSI użyć dokładnie tego, więc nie widzę co "większość LCG, które są gdzieś używane" ma do czynienia z przypadkiem - java .Random ma swoje bardzo dokładne zasady. –