【发布时间】:2013-11-08 06:53:11
【问题描述】:
我正在寻找最有效的方法来随机抽取nelements 在一个列表中给定一个概率列表,说明每个元素被选中的概率。
aList = [3,4,2,1,4,3,5,7,6,4]
MyProba = [0.1,0.1,0.2,0,0.1,0,0.2,0,0.2,0.1]
这意味着在每次抽奖时,第一个元素(即3)有0.1的概率被抽奖。当然,
sum(MyProba) == 1 # 总是返回 True len(aList) == len(MyProba) # 总是返回 True
到目前为止,我做了以下工作:
def random_pick(some_list, proba):
x = random.uniform(0, 1)
cumulative_proba = 0.0
for item, item_proba in zip(some_list, proba):
cumulative_proba += item_proba
if x < cumulative_proba:
break
return item
nb_draws = 10
list_of_drawn_elements = []
for one_draw in range(nb_draws):
list_of_drawn_elements.append(random_pick(aList, MyProba))
它可以工作,但是对于长列表和较大的 nb_draws 值非常慢。 如何提高此过程的速度?
注意:在我面临的特殊情况下,nb_draws 总是等于aList 的长度。
【问题讨论】:
-
你试过使用 Numpy 的多项式类吗?它可以满足您的需求,并且如果用 C 实现可能会更快(我不知道。您必须对其进行测试。)请参见此处:docs.scipy.org/doc/numpy/reference/generated/…
-
numpy.random.choice更合适。所有繁重的工作都在 C 中完成,算法应该比您使用的更高效。 -
您可能有兴趣在 Python 中阅读 Bendersky 在 weighted random choice 上的页面——它列出了许多可能的方法并提供了性能比较。
标签: python list random performance