1

ランダムなコイントスの結果に応じて、文字列からランダムな開始位置をサンプリングする必要があるという問題があります。このランダムな位置のサンプリングが文字列全体で均一である場合、それを行うための 2 つのアプローチを考えました。これを次のようにテストしました。

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 を使用して、これをより高速にするためのベクトル化された方法はありますか?

ありがとう。

4

1 に答える 1

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 を使用することは、明らかに最速です。

于 2010-04-11T19:57:08.697 に答える