我有一个问题,根据随机硬币翻转的结果,我必须从字符串中采样随机起始位置。如果这个随机位置的采样在字符串上是一致的,我想到了两种方法:一个使用numpy.random中的多项式,另一个使用Python标准lib的简单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()
输出结果为:
Multinomial:6.58072400093秒 兰德采取:2.35189199448秒
似乎randint更快,但对我来说似乎仍然很慢。有没有一种矢量化的方法可以让它更快,使用numpy或scipy?感谢。
答案 0 :(得分: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显然是最快的。