[英]Single Vs. Multiple For Loops In Python?
在比較python
中的以下代碼示例時( 300
只是一個示例;實際上,假設我們需要循環遍歷10,000,000
個項目):
sum = 0
for i in xrange(0, 300):
sum += i
比。
sum = 0
for i in xrange(0, 100):
sum += i
for i in xrange(100, 200):
sum += i
for i in xrange(200, 300):
sum += i
兩個版本在運行時間方面是否相同? 我有一個問題,我有一個巨大的向量(比如 10,000 個項目)。 我不一定要遍歷所有這些,除非滿足某些條件(這些條件只能在第一個循環(使用前 100 個項目)完成時評估)。
然后,只有在滿足某些條件時才應該繼續循環(這些條件只能在檢查接下來的 100 個項目時評估)。
然后,只有在滿足某些條件時才應該繼續循環(這些條件只能在檢查接下來的 100 個項目時評估)。
同樣的故事,直到我到達矢量的盡頭......
鑒於我可以通過檢查點以模塊化方式解決我的問題:
{0, 100} {100, 200} {200, 300}........ {9900, 10,000}
我只是想了解第二種方法是否與第一種方法一樣有效。 謝謝。
注意:為簡單起見,此處使用sum
。 在實踐中,將要使用的數學運算的運行時間要長得多。 這就是為什么我試圖通過檢查不同的編碼方法來尋找優化運行時間的方法......
你希望看到什么樣的改進?
timeit
將幫助您觀察差異:
$ python -m timeit 'sum = 0
> for i in xrange(0, 300):
> sum += i'
10000 loops, best of 3: 21.8 usec per loop
$ python -m timeit 'sum = 0
> for i in xrange(0, 100):
> sum += i
> for i in xrange(100, 200):
> sum += i
> for i in xrange(200, 300):
> sum += i'
10000 loops, best of 3: 22.8 usec per loop
就個人而言,我會 go 用於:
$ python -m timeit 'sum(xrange(300))'
100000 loops, best of 3: 5.34 usec per loop
此示例可能不是評估您是否能夠優化實際代碼的最佳方法,但它確實演示了如何測試一個小片段的運行時間。
只要記住Donald Knuth 所說的優化;-)
這是一種可以檢查迭代並在需要時中斷的方法:
>>> for index, item in enumerate(vect):
... results = do_stuff_with(item)
... if index % 100 == 0 and should_we_stop(results):
... break
更好的是,如果您可以讓do_stuff_with()
返回一個指示它是否已完成的tuple
,那么您可以檢查每次迭代是否完成,而不是等待:
>>> for item in vect:
... finished, results = do_stuff_with(item)
... if finished:
... break
只是重申一下(不是雙關語),很難說如何(甚至是否)在沒有實際看到的情況下優化您的實際代碼!
如果您不打算遍歷所有內容,那么設置新生成器 ( xrange
) 的成本非常小。
因此,如果您有時跳過其中一個或兩個循環,則第二種方法會更快。
也就是說,如果您的列表只有 300 大,那么差異將可以忽略不計,大約為毫秒或微秒。
如果您想比較速度,只需對它們進行計時:
import timeit
chunk1 = '''
sum = 0
for i in xrange(0, 300):
sum += i
'''
chunk2 = '''
sum = 0
for i in xrange(0, 100):
sum += i
for i in xrange(100, 200):
sum += i
for i in xrange(200, 300):
sum += i
'''
timer1 = timeit.Timer(chunk1)
timer2 = timeit.Timer(chunk2)
print timer1.timeit(100000)
print timer2.timeit(100000)
我得到了100,000
次迭代的這些數字:
3.44955992699
3.56597089767
如您所見,第二段代碼稍慢。
您可能可以嘗試使用while
循環和break
語句,所以這就是我解釋您嘗試做的事情:
i = 0
while i < limit:
stop = False
for j in xrange(i + 100, i + 300):
if i == foo:
stop = True
break
if stop: break
i += 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.