首页 > 解决方案 > 根据 np.random.random 的结果制定 if/elif 语句的更有效方法?

问题描述

我正在尝试加快我的代码,该代码具有以下形式的长 if/elif 语句:

random = np.random.random()
tot = a + b + c + d

if random < a/tot:
   var1 += 1
elif a/tot < random < (a+b)/tot:
   var1 -= 1
elif (a+b)/tot < random < (a+b+c)/tot:
   var2 += 1
elif (a+b+c)/tot < random < 1:
   var2 -= 1

我试图想办法用字典来做到这一点,但我不知道如何索引它。代码按原样工作,但是我正在尝试加快这部分代码的速度,这会占用大量运行时间。有没有其他方法可以做到这一点?

标签: pythonpython-3.xif-statementrandom

解决方案


您可以使用二分法来确定您的随机数落在哪个“bin”中:

bins = np.cumsum([0., a, b, c, d])
bins /= bins.sum()

updates_var1 = [1, -1, 0, 0]
updates_var2 = [0, 0, 1, -1]

index = bisect.bisect(bins, random) - 1
var1 += updates_var1[index]
var2 += updates_var2[index]

这个解决方案可以通过使用np.searchsorted而不是矢量化bisect.bisect


推荐阅读