如何加速Python中的循环进度?

时间:2015-07-28 12:20:20

标签: python loops optimization

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

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

因此,将打印范围1中的所有数字,直到1193616,这个循环进度需要很长时间.. 如何让它快?

编辑:

实际上,我尝试为图像数据(Raster)制作一个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(开始)和e_id = 1193616(结束),第3行发生了长时间循环进度 while e_id not in Op : 有没有办法加速或优化我的代码?

5 个答案:

答案 0 :(得分:6)

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

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

编辑:

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

注意它并不总是#34;缓冲区&#34;的最佳解决方案。在一次写入之前将所有数据放入程序中(可能耗尽内存资源),我怀疑打印到超过数百行的终端是否有用...

答案 1 :(得分:1)

循环本身非常有效,它实际上是&#34; print&#34;导致开销的声明。例如,使用变量赋值替换打印件,您将看到差异。此外,值得一提的是你的&#34;范围&#34;呼叫可以简化为范围(1193616)

答案 2 :(得分:1)

不是在每次迭代中打印数字而是连接它们并打印一次,但由于str.join接受字符串对象,您可以使用{{1}在其数字上应用str函数将它们转换为字符串功能:

map

答案 3 :(得分:1)

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

例如,如果将迭代次数减少一半,它会更快!如果无法改变,那么你无法做太多的事情。

否则,请更改执行的操作。在这种情况下,将'print'语句更改为'pass'。当然,结果不一样。

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

通常,优化的代码要复杂得多。它可能涉及调用函数,对列表,字符串或其他数据结构进行操作。因此,解决方案是理解预期结果以及如何以较少的工作实现该结果。比较它去商店旅行。您可以在城市周围开车,在每个灯光处停下来并穿过每个街区,或者您可以直接绕着街区前往最近的商店。一个是“优化的”,即使两个“工作”。

答案 4 :(得分:0)

如上所述,Xrange应该更快一点,例如for x in xrange(n):做点什么。你的计划应该做什么?