我正在尝试加速我的代码,它有一个长的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
我试着想办法用字典来做这件事,但我想不出我该如何索引它。代码按原样工作,但是我正在尝试加速代码的这一部分,它占用了运行时的大量时间。还有别的办法吗?
4条答案
按热度按时间jvidinwx1#
您可以使用二分法来确定随机数落在哪个“bin”中:
这个解决方案可以通过使用
np.searchsorted
而不是bisect.bisect
.ou6hu8tu2#
我在这里看到的只有几件事:
您只需要第二个条件(第一个条件已经在前面的if中检查过了,所以您知道它的倒数是真的)
如果
if-else
链条在一个圈里,而且a,b,c,d
在这个循环中是固定的,然后提前计算和和和除法(在进入循环之前)更改最后一个
elif
由else
导致您可以尝试的另一件事是将if-else链放入函数中,并使用numba、pythran或cython为其生成编译代码。
lskq00tm3#
假设每个项目的可能性相同,那么可能值得做:
这将导致每个迭代执行两次
if
声明,而您的版本只需要一个a
但是四个人d
再说一次,如果你在这里花了大量的时间,那么你可能值得做些别的事情。e、 矢量化的东西,或依赖于一些分析统计结果,这样你就不必画那么多的样本ryevplcw4#
通过移除分区,这可能是最有效的: