是否有一种Pythonic方法可以跳过for循环中的if语句,从而加快代码的运行速度?

是否有一种Pythonic方法可以跳过for循环中的if语句,从而加快代码的运行速度?,python,loops,if-statement,optimization,iteration,Python,Loops,If Statement,Optimization,Iteration,我正在用Python编写一个脚本,它本质上是掷骰子,并检查掷骰子是否超过数字x。我想重复这个过程n次,得到模辊超过x的概率。e、 g 计数=0 对于itertools.repeatNone中的uu,迭代次数: x=3 模具滚动=随机数1,6 如果模具滚动>x: 计数+=1 超过的概率=计数/迭代次数 我想根据用户输入修改模具辊和x。此用户输入将选择不同的例程来修改脚本,例如,Andy的_例程可能会将x更改为4。目前,我在for循环中使用if语句来检查哪些例程是活动的,然后应用它们,例如 计数=0

我正在用Python编写一个脚本,它本质上是掷骰子,并检查掷骰子是否超过数字x。我想重复这个过程n次,得到模辊超过x的概率。e、 g

计数=0 对于itertools.repeatNone中的uu,迭代次数: x=3 模具滚动=随机数1,6 如果模具滚动>x: 计数+=1 超过的概率=计数/迭代次数 我想根据用户输入修改模具辊和x。此用户输入将选择不同的例程来修改脚本,例如,Andy的_例程可能会将x更改为4。目前,我在for循环中使用if语句来检查哪些例程是活动的,然后应用它们,例如

计数=0 对于itertools.repeatNone中的uu,迭代次数: x=3 如果安迪的例行程序处于活动例行程序中: x=4 模具滚动=随机数1,6 如果比尔的例行程序处于活动例行程序中: 模具辊+=1 如果克洛伊的例行程序处于活动例行程序中: 做点什么 通过 如果在活动例行程序中有人的例行程序: 做点别的 通过 如果模具滚动>x: 计数+=1 超过的概率=计数/迭代次数 在实践中,例程并不是简单到可以推广的程度,例如,它们可能会添加额外的输出。这些例程可以同时实现。问题是可能有数千个不同的例程,因此每个循环将花费大部分时间检查if语句,从而降低程序的速度


有没有更好的方法来构造代码,检查哪些例程只使用一次,然后以某种方式修改迭代

您在这里要求两件事-您希望您的代码更具python风格,并且希望它运行得更快

第一个更容易回答:使活动的_例程成为函数列表而不是字符串列表,并从列表中调用函数。由于这些函数可能需要更改局部状态x和die_roll,因此需要将状态作为参数传递给它们,并让它们返回新状态。重构可能如下所示:

def和YX,模具辊: 返回4,模具滚动 def Billx,模具辊: 返回x,骰子掷骰+1 def Chloex,模具辊: 做点什么 返回x,模具滚动 积极的例行程序=[安迪、比尔、克洛伊] 计数=0 对于Range迭代中的i: x=3 模具滚动=随机数1,6 对于活动_例程中的例程: x、 压模辊=压模辊,压模辊 如果模具滚动>x: 计数+=1 超过的概率=计数/迭代次数
第二个问题更难回答。这种重构现在进行了大量的函数调用,而不是检查是否存在条件;所以可能会更少,但更多。您必须对其进行基准测试,例如使用以确保。但是,至少这段代码应该更易于维护。

您是在寻找continue语句吗?为什么要使用itertools.repeat?您是在寻找类似switch语句的语句吗?如果python不支持这一点,但是您可以使用dict来做类似的事情,不过在您的情况下,这将需要更多的工作,然后在每次循环迭代中执行所有这些函数。如果语句是导致代码运行缓慢的原因,则不太可能。更可能是因为您正在执行许多顺序函数。如果你的迭代次数很高,那么可以为x和die_roll的组合建立一个结果表,这样如果你的迭代与前一个迭代的状态相同,而不是重新计算所有函数,只需查找您之前计算的结果,即备忘录。如果您要使代码更具Python风格,则应使用pep8命名约定。也可能是为了可读性而进行元组解包,即代替状态x,die_roll=routinex,die_roll;我选择保持名称不变,以防它与任何其他代码接口,并且因为命名与问题无关,但您是对的,遵循Python的命名约定将改进代码。对不起,我应该将be-pythonic条件排除在我的问题之外。我真的只想知道是否有更好的方法来构造代码,使其运行得更快。我添加了这个条件,因为我的第一个想法是写一些东西来编写另一个python脚本,然后运行它,这听起来不太明显。。。