1

我有一个问题,根据随机硬币翻转的结果,我必须从字符串中采样一个随机起始位置。如果这个随机位置的采样在字符串上是统一的,我想到了两种方法来做到这一点:一种使用 numpy.random 中的多项式,另一种使用 Python 标准库的简单 randint 函数。我对此进行了如下测试:

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 回答