【问题标题】:Python efficient way to write nested if-else inside nested for-loopPython 在嵌套 for 循环中编写嵌套 if-else 的有效方法
【发布时间】:2019-10-24 04:55:18
【问题描述】:

我正在处理一个代码挑战,我必须尽可能减少执行时间,我唯一能找到可以改进的地方是嵌套 for- 中的嵌套 if-else 语句-循环,但我不确定如何即兴发挥。

这是我的代码:

mat = [[0] * n] * n
count = 0
for i in range(n,0,-1):
    count += 1
    for j in range(i,n+1,1):
        if i == j:
            pass
        else:
            if getEnemyStatus(mat, i, j):
               break
            else:
                if isEnemy(enemyDict, i, j):
                    setStatus(mat, i, j)
                    break
                else:
                    count += 1

n 的值可以是 1 到 10^5

【问题讨论】:

  • 你能显示完整的代码吗?
  • 好的。仅此部分代码无法为您提供帮助...
  • 你怎么知道这是唯一可以优化的东西?什么是敌人和状态功能?你能优化它们吗?什么是垫子?
  • 您可以跳过range中以i+1开头的第一个if条件。
  • 你应该真的提供一个minimal reproducible example - 也许一开始你应该在解决性能问题之前让你的代码启动并运行(有意义)。至少我怀疑mat = [[0] * n] * n 是否符合您的要求,因为它会创建一个 list 副本 的列表,如果您在其中进行更改,例如m[0][1] 所有m[n][1] 都会相应更改。或者这是故意的,你知道并经过测试?

标签: python python-3.x for-loop


【解决方案1】:

您可以在range 中以i+1 开头,跳过第一个if condition

for j in range(i+1, n+1, 1):
   # code here

第二,嵌套if else条件应避免与elif一起阅读。

更新代码应该是这样的:

mat = [[0] * n] * n
count = 0
for i in range(n,0,-1):
    count += 1
    for j in range(i + 1, n + 1, 1):
        if getEnemyStatus(mat, i, j):
            break
        elif isEnemy(enemyDict, i, j):
            setStatus(mat, i, j)
            break
        else:
            count += 1

注意:另外,如果您可以在isEnemy function 中设置状态setStatus,那么您可以获得更简洁的代码:

mat = [[0] * n] * n
count = 0
for i in range(n,0,-1):
    count += 1
    for j in range(i + 1, n + 1, 1):
        if getEnemyStatus(mat, i, j) or isEnemy(enemyDict, i, j):
            break
        count += 1

【讨论】:

  • @AbdulRehman 对于这个特定的代码答案是肯定的,现在只有一个if 条件将在for 循环中检查以打破内部循环。其他性能现在取决于getEnemyStatusisEnemy 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多