【问题标题】:How to accelerate looping progress in Python?如何加速 Python 中的循环进度?
【发布时间】:2015-10-19 00:01:05
【问题描述】:

我的问题很简单。我有一个像这样的python简单代码:

for i in range(1,1193616,1) :
        print i

因此将打印 1 到 1193616 范围内的所有数字,并且此循环过程花费了很长时间.. 如何让它快速?

编辑:

实际上,我尝试为图像数据(光栅)制作一个 A-star 寻路程序。 到目前为止,这是我的 A-star 函数脚本:

def A_star(h,c,dx,dy,u,s_id,e_id,Op,Cl,Prt,CC,o,ht,w):
    Op.append(s_id) 
    while e_id not in Op : 
        if Op == [ ] :
            break
        candidate = { }
        for i in Op :
            d = {i : CC[i]}
            candidate.update(d)
        o = min(candidate, key=candidate.get)
        Cl.append(o)
        Op.remove(o)
        adjacent_list = adjacent_cell(o,dx,dy )
        for p in adjacent_list :
            if p in Cl:       
                adjacent_list = filter(lambda i: i != p, adjacent_list)    
            elif p not in Op :   
                Op.append(p)
                d = {p : o }
                Prt.update(d)
                d = {p : F(p,o,h,u,w,c,dx,e_id,ht,CC)}
                CC.update(d)
            elif id in Op : 
                f1 = F(p,o,h,u,w,c,dx,e_id,ht,CC) 
                f2 = F(p,Prt[p],h,u,w,c,dx,e_id,ht,CC)
                if f1 < f2 :  
                    d = {p : o }
                    Prt.update(d)
                    d = {id : F(p,o,h,u,w,c,dx,e_id,ht,CC)}
                    CC.update(d)
    return Prt

假设 s_id = 1 (start) and e_id = 1193616 (end), 长时间循环进度发生在第 3 行 while e_id not in Op : 有什么方法可以加速或优化我的代码?

【问题讨论】:

  • 我很确定印刷是你的瓶颈。尝试仅将pass 作为循环体并在循环完成后打印。应该快很多。
  • 这不是循环,而是将无缓冲文本写入控制台。
  • 打印你想做的事吗?为什么是 1193616?打印速度很慢。如果您想做除打印以外的其他事情,我们需要有关它的更多详细信息,以了解您是否可以实际优化它。
  • 如前所述,循环很好,但对于 Python 2,您可能更喜欢 xrange 以获得性能。

标签: python loops optimization


【解决方案1】:

通常慢的是输出,而不是循环;你可以这样做:

print '\n'.join('%s' % c for c in range(1, 1193616))

编辑:

在我的系统上,当输出是终端时,你的代码用了 10.193s,而我的版本用了 2.374s。 如果它被重定向到一个文件,它是 0.486s vs 0.572s(差别不大)。

请注意,在一次写入之前将所有数据“缓冲”到程序中并不总是最好的解决方案(您可能会耗尽内存资源),而且我怀疑打印到终端而不是数百行...

【讨论】:

    【解决方案2】:

    不是在每次迭代中打印数字,而是加入它们并打印一次,但由于str.join 接受字符串对象,您可以通过使用map 函数对其数字应用str 函数将它们转换为字符串:

    print '\n'.join((map(str,range(1,1193616))))
    

    【讨论】:

      【解决方案3】:

      循环本身非常有效,实际上是“打印”语句导致了开销。例如,将 print 替换为变量赋值,您会看到不同之处。此外,值得一提的是,您的“范围”调用可以简化为 range(1193616)

      【讨论】:

      • 甚至xrange,如果你真的在寻找性能提升
      【解决方案4】:

      以这种方式定义问题后,您无能为力。大多数优化都涉及减少处理器执行的工作量。这可能意味着调整数据以减少要处理的数据。

      例如,如果您将迭代次数减少一半,它会更快!如果这不能改变,那么你就无能为力了。

      否则,更改执行的操作。在这种情况下,将“打印”语句更改为“通过”。当然,结果不会一样。

      如果您使用的是 Python 2,那么 range() 实际上会分配一个列表,分配数字对象并在循环开始之前填充该列表。 Python 3 返回一个避免所有内存分配和初始化的迭代器,因此速度更快。 (Python 2 有一个类似的 xrange() 函数,但无论如何你最好还是使用 Python 3)

      通常被优化的代码要复杂得多。它可能涉及调用函数、对列表、字符串或其他数据结构进行操作。因此,解决方案是了解预期结果以及如何以更少的工作实现该结果。把它比作去商店旅行。你可以在城市里四处行驶,在每一个可以看到的灯光下停下来,穿过每个街区,或者你可以直接绕过街区到最近的商店。一个是“优化的”,即使两者都“工作”。

      【讨论】:

        【解决方案5】:

        如上所述,Xrange 应该更快一些,例如for i in xrange(n): 做某事。你的程序应该做什么?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-06
          • 2019-01-28
          • 2015-11-24
          • 1970-01-01
          • 2022-01-21
          • 2023-03-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多