【问题标题】:for loop while loop efficiency in PYTHONPython中的for循环while循环效率
【发布时间】:2014-09-02 04:14:26
【问题描述】:

我是编程的初学者,并开始使用 Python 作为学习它的一种手段。我目前正在研究一组使用 for 循环 () 和 while 循环 () 的行。 目前我有这个:

def missingDoor(trapdoor,roomwidth,roomheight,step):        
    safezone = []
    hazardflr = givenSteps(roomwidth,step,True)
    safetiles = []

    for i,m in enumerate(hazardflr):
    safetiles.append((m,step))
        while i < len(safetiles):
            nextSafe = safetiles[i]
            if knownSafe(roomwidth, roomheight, nextSafe[0], nextSafe[1]):
                if trapdoor[nextSafe[0]/roomwidth][nextSafe[0]%roomwidth] is "0":
                    if nextSafe[0] not in safezone:
                        safezone.append(nextSafe[0])
                    for e in givenSteps(roomwidth,nextSafe[0],True):
                        if knownSafe(roomwidth, roomheight, e, nextSafe[0]):
                            if trapdoor[e/roomwidth][e%roomwidth] is "0" and (e,nextSafe[0]) not in safetiles:
                                safetiles.append((e,nextSafe[0]))
            i += 1  
    return sorted(safezone)

然后在社区成员的帮助下,我能够更有效地将公共变量 nextSafe[0] 设置为 ns 并从顶部调用它:

def missingDoor(trapdoor,roomwidth,roomheight,step):        
    safezone = []
    hazardflr = givenSteps(roomwidth,step,True)
    safetiles = []

    for i,m in enumerate(hazardflr):
    safetiles.append((m,step))
        while i < len(safetiles):
            nextSafe = safetiles[i]
            ns0 = nextSafe[0]
            if knownSafe(roomwidth, roomheight, ns0, nextSafe[1]):
                if trapdoor[ns0/roomwidth][ns0 % roomwidth] is "0":
                    if ns0 not in safezone:
                        safezone.append(ns0)
                    for e in givenSteps(roomwidth,ns0,True):
                        if knownSafe(roomwidth, roomheight, e, ns0):
                            if trapdoor[e/roomwidth][e%roomwidth] is "0" and (e, ns0) not in safetiles:
                                safetiles.append((e, ns0))
            i += 1  
    return sorted(safezone)

这些都取代了价值效率,但有没有其他方法可以提高效率并可能节省线路? knownSafe(), givenSteps() 函数来自另一个代码,该代码与此代码一起查找可能的安全区和已知步骤。但我的问题是如何使这段代码更高效,因为最初我开始使用 while loops() 并发现在给定已知列表时 for 循环更好。考虑到我是编程新手,一直在尝试各种事情。

提前谢谢你!!

【问题讨论】:

  • 请确保您的示例中的缩进是正确的。至少for 语句之后的行处于错误的缩进级别。
  • 你能描述一下你的算法吗?
  • 如果此代码有效(您有测试输入和输出来检查吗?)考虑将问题移至codereview.stackexchange.com。另外,请考虑您所说的效率是什么意思 - 内存使用、处理速度、可读性……

标签: python python-2.7 if-statement for-loop while-loop


【解决方案1】:

那么 .. 你想要代码审查吗? Here ..

无论如何,我会尽力帮助你..

代码

def missingDoor(trapdoor, roomwidth, roomheight, step):
    safezone, safetiles = [], []
    check = lambda a, b, c, l: knownSafe(roomwidth, roomheight, a, b) and trapdoor[a/roomwidth][a%roomwidth] == '0' and c not in l

    for i, m in enumerate(givenSteps(roomwidth, step, True)):
        safetiles.append((m, step))
        for _ in range(i, len(safetiles)):
            nextSafe = safetiles[i]
            ns0 = nextSafe[0]

            if check(ns0, nextSafe[1], ns0, safezone):
                safezone.append(ns0)
                safetiles.extend([ (e, ns0) for e in givenSteps(roomwidth,ns0,True) if check(e, ns0, (e, ns0), safetiles) ])
    return sorted(safezone)

说明

第 1 行:函数定义
第2行:声明变量,这种在一行上声明多个变量的简洁风格与效率无关,只是风格问题
第 3 行:这是一个重要的方法,因为它展示了 函数式编程 (python 支持的编程范式之一) 如何帮助提高代码清晰度(同样,没有内存效率,只是代码效率,从长远来看会有所帮助).. lambda 简而言之,只是一个压缩函数,只包含一行代码,并将其返回,所以这里不需要 return 语句,实际上,有对 lambda 的影响远不止于此,但这基本上就是为什么你想在这样的情况下实现一个.. 这里这个特定的目标是使用你每隔几行运行一次的重复检查来检查变量我不能'不禁注意到它是多么的混乱!所以这个函数的存在是为了简单地组织它.. 第一个和第二个参数是不言自明的,第三个参数是在第四个参数(我想是一个列表)中检查它的存在..
第 5 行:循环开始,没什么奇怪的,只是我将函数的返回值直接使用到循环中,因为我认为将其存储为变量并仅使用一次会浪费 RAM ..
第 6 行:不变..
第 7 行:我将 while 循环更改为 for 循环,因为我注意到您使用 while 循环而不是 for 循环的唯一原因是每次外部循环运行时 i 的值都会发生变化,那么,为什么不提供一个范围呢?这样代码和内存效率会更高
第 8、9 行:不变..
第 11 行:我们使用了 lambda,tadaaa !像函数一样调用..
第 12 行:未更改 ..
第 13 行:这里的技术称为 List Comprehension,这有点高级,但简而言之,它创建一个列表,每次循环运行时,它都会获取最左边的值, 每次循环运行时都会执行右边的任何其他条件,如果返回 true,则附加最左边的值,否则,循环继续。. 从所有这些返回的列表,被添加到 safetiles 列表中,注意那:列表的扩展方法只是将参数列表中的所有元素附加到调用者列表,在这种情况下:作为列表理解的结果返回的列表中的每个元素,只是被附加到安全标签..这个看起来并没有真正的矫枉过正,因为它实际上澄清了代码,并且使用更少的内存..
第 14 行:返回安全标签列表 .. Mission Accomplished!

希望这会有所帮助;) 请注意,使用“is '0'”检查不是一个好习惯,更好的是:“== '0'”

【讨论】:

  • 在它说的行中:for i, m in enumerate(givenSteps(roomwidth, step, True)):这将返回“TypeError: givenSteps() 需要 4 个参数(3 个给定)”跨度>
  • Amr,能否解释一下 lambda a, b, c, l: knownSafe(roomwidth, roomheight, a, b) 到底在做什么
  • 我解释了一切;)
  • @SteveZrg 你得到的 TypeError 是因为你只为需要四个 .. 的函数提供了三个参数。请注意,原始代码只提供了三个 .. 我没有更改函数调用
  • 那么对于该行,第四个参数是什么?还是我忽略了什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 2016-06-07
  • 2019-06-03
  • 2020-05-15
  • 1970-01-01
  • 2020-10-09
  • 2018-07-24
相关资源
最近更新 更多