2010-04-11 26 views
1

我有一個問題,根據隨機硬幣翻轉的結果,我必須從一個字符串中抽樣一個隨機起始位置。如果這個隨機位置的採樣在字符串上是一致的,我想到了兩種方法:一個使用numpy.random中的多項式,另一個使用Python標準lib的簡單randint函數。我測試了這個如下:使用numpy/scipy在Python中統一採樣整數

from numpy import * 
from numpy.random import multinomial 
from random import randint 
import time 

def use_multinomial(length, num_points): 
    probs = ones(length)/float(length) 
    for n in range(num_points): 
    result = multinomial(1, probs) 

def use_rand(length, num_points): 
    for n in range(num_points): 
    rand(1, length) 

def main(): 
    length = 1700 
    num_points = 50000 

    t1 = time.time() 
    use_multinomial(length, num_points) 
    t2 = time.time() 
    print "Multinomial took: %s seconds" %(t2 - t1) 

    t1 = time.time() 
    use_rand(length, num_points) 
    t2 = time.time() 
    print "Rand took: %s seconds" %(t2 - t1)  

if __name__ == '__main__': 
    main() 

輸出是:

多項花:6.58072400093秒 蘭德花:2.35189199448秒

好像randint速度更快,但它似乎仍然很慢我。有沒有一種矢量化的方式來使這個更快,使用numpy或scipy?

謝謝。

回答

3

我改變你的代碼實際上返回值(和使用randint代替rand - ?是不是你的意思)這樣的...

def use_multinomial(length, num_points): 
    probs = ones(length)/float(length) 
    return multinomial(1, probs, num_points) 

def use_rand(length, num_points): 
    return [randint(1,length) for _ in range(num_points)] 

然後我想我自己的版本,使用numpy.random.randint產生隨機點對串的numpy的數組:

def use_np_randint(length, num_point): 
    return nprandint(1, length, num_points) 

結果:

Multinomial took: 13.6279997826 seconds 
Rand took: 0.185000181198 seconds 
NP randint took: 0.00100016593933 seconds 

多項式顯然非常慢比較,但是,即使你想要什麼?我以爲你說你想要一個統一的分配?使用numpy的randint顯然是一羣中最快的。