【发布时间】:2019-11-08 13:33:38
【问题描述】:
我正在用 Python 编写一个脚本,该脚本本质上是掷骰子并检查掷骰子是否超过数字x。我想重复这个过程n 次,得到掷骰子数超过x 的概率。例如
Count = 0
for _ in itertools.repeat(None, Iterations):
x = 3
die_roll = rnd.randint(1,6)
if die_roll > x:
Count += 1
Probability_of_exceed = Count / Iterations
我想根据用户输入同时修改骰子和 x。此用户输入将选择不同的例程来修改脚本,例如"Andy's_Routine" 可能会将 x 更改为 4。目前,我在 for 循环中使用 if 语句来检查哪些例程处于活动状态,然后应用它们,例如
Count = 0
for _ in itertools.repeat(None, Iterations):
x = 3
if "Andy's_Routine" in Active_Routines:
x = 4
die_roll = rnd.randint(1,6)
if "Bill's_Routine" in Active_Routines:
die_roll += 1
if "Chloe's_Routine" in Active_Routines:
# do something
pass
if "Person_10^5's_Routine" in Active_Routines:
# do something else
pass
if die_roll > x:
Count += 1
Probability_of_exceed = Count / Iterations
在实践中,例程并不是那么简单,以至于它们可以被概括,例如,它们可能会添加额外的输出。这些例程可以同时执行。问题是可能有成千上万个不同的例程,这样每个循环将花费大部分时间检查 if 语句,从而减慢程序的速度。
有没有更好的方法来构造代码来检查哪些例程只使用一次,然后以某种方式修改迭代?
【问题讨论】:
-
您在寻找
continue声明吗? -
你为什么要使用 itertools.repeat?
-
您在寻找类似 switch 语句的东西吗?如果是这样,python 不支持,但你可以使用
dict来做类似的事情(虽然在你的情况下会做更多的工作)。 -
不是
Active_Routines是一个字符串列表,而是一个函数列表,然后在每个循环迭代中执行所有这些函数。 -
if语句不太可能导致您的代码运行缓慢。这更有可能是因为您正在执行许多顺序功能。如果您的迭代次数很高,那么可以为x和die_roll的组合构建一个结果表,这样如果您的迭代具有与前一个相同的状态,而不是重新计算所有函数,只需查找您之前计算的结果(即记忆化)。
标签: python loops if-statement optimization iteration