python – 复杂列表理解比直接循环慢
发布时间:2020-12-20 11:59:09 所属栏目:Python 来源:网络整理
导读:我在 leetcode上看到了一个有趣的编程练习解决方案.它甚至不是问题/解决方案本身,所以如果你愿意,你可以在提供的链接上阅读它.然而,这是一个很高的投票解决方案: 片段1 def fizzBuzz2(n): return ["Fizz" * (not i%3) + "Buzz" * (not i%5) or str(i) for i
我在
leetcode上看到了一个有趣的编程练习解决方案.它甚至不是问题/解决方案本身,所以如果你愿意,你可以在提供的链接上阅读它.然而,这是一个很高的投票解决方案:
片段1 def fizzBuzz2(n): return ["Fizz" * (not i%3) + "Buzz" * (not i%5) or str(i) for i in range(1,n+1)] 片段2 def fizzBuzz(n): out = [] for i in range(1,n+1): if i % 3 == 0 and i % 5 == 0: out.append("FizzBuzz") elif i % 3 == 0: out.append("Fizz") elif i % 5 == 0: out.append("Buzz") else: out.append(str(i)) return out 但是,我期望列表理解能够击败常见的循环,但是当我计时它并不是这样的时候.甚至做了一个dis,Snippet 2有更多指令. 是什么让Snippet 1慢? 解决方法
你的片段
def fizzBuzz2(n): return ["Fizz" * (not i%3) + "Buzz" * (not i%5) or str(i) for i in range(1,n+1)] 执行大量的字符串连接(即使是空字符串).我通过额外的模运算来交换它,这节省了连接并且它已经更快了. def fizzBuzz3(n): return ["FizzBuzz" if not i%15 else "Fizz" if not i%3 else "Buzz" if not i%5 else str(i) for i in range(1,n+1)] 在我的机器上BTW,两种理解都比“经典”方法更快,所以我得到的结果与你说的不同: your comp: 4.927702903747559 my listcomp: 4.343341112136841 classical: 6.015967845916748 所以我的优化listcomp获胜(并且似乎也在你的机器上获胜),即使我对listcomp的流控制引起的额外模运算不满意) 我的测试协议执行10000次操作,n = 1000: import time start_time = time.time() for i in range(10000): fizzBuzz2(1000) print("your comp:",time.time()-start_time) start_time = time.time() for i in range(10000): fizzBuzz3(1000) print("my listcomp:",time.time()-start_time) start_time = time.time() for i in range(10000): fizzBuzz(1000) print("classical:",time.time()-start_time) 请注意,即使预先计算“经典”方法中的模数,它也会下降到5.375272035598755秒(这很好),但由于所有指令仍然比listcomps更糟糕(你还通过调用一个方法来保存模数来杀死listcomp的速度计算).我想python并不是获得最快速度的正确语言. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |