我的问题非常简单。我有一个像这样的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 :
有没有办法加速或优化我的代码?
答案 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):做点什么。你的计划应该做什么?