我正在用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语句,从而减慢程序的运行速度。
有没有更好的方法来构建代码,检查哪些例程只使用一次,然后以某种方式修改迭代?
您在这里要问两件事——您希望您的代码更加Python化,并且希望它运行得更快。
第一个更容易回答:使Active_Routines
成为函数列表,而不是字符串列表,并从列表中调用函数。由于这些函数可能需要更改本地状态(x
和die_roll
(,因此需要将状态作为参数传递给它们,并让它们返回新状态。重构程序可能看起来像这样:
def Andy(x, die_roll):
return (4, die_roll)
def Bill(x, die_roll):
return (x, die_roll + 1)
def Chloe(x, die_roll):
# do something
return (x, die_roll)
Active_Routines = [Andy, Bill, Chloe]
Count = 0
for i in range(Iterations):
x = 3
die_roll = rnd.randint(1,6)
for routine in Active_Routines:
x, die_roll = routine(x, die_roll)
if die_roll > x:
Count += 1
Probability_of_exceed = Count / Iterations
第二个问题更难回答。这种重构现在进行了大量的函数调用,而不是检查if
条件;因此,可以减少遗漏的分支预测,但增加函数调用开销。您必须对其进行基准测试(例如使用timeit库(才能确定。但是,至少这个代码应该更易于维护。