2014-10-28 31 views
0

我想了解什麼是最有效的方式來限制我的循環範圍。這裏的想法是我的j被輸入到一個需要事先確定的函數中。使循環範圍有條件的最佳方法?

我正在處理的問題的一個約束是j必須總是小於i。

max_value = None 

for i in range(1,1499): 
    for j in range(1,1499): 
     if i > j: 
      candidate = some_function(i,j) 
      if candidate > max_value: 
       max_value = candidate 

現在我的i> j聲明在這裏沒有必要,因爲最好的解決方案總是會在i> j的地方。但是,因爲我知道這一點,所以我想利用這個來限制我的範圍,並停止計算更多的循環。

什麼是最好的方式去做這件事?我在想這件事可能會起作用:

max_value = None 

for i in range(1,1499): 
    for j in range(1,i): 
     candidate = some_function(i,j) 
     if candidate > max_value: 
      max_value = candidate 

還有其他想法或建議嗎?實際的循環問題比這個要大得多,所以速度是一個考慮因素,任何建議都是值得歡迎的!

+0

「可能工作」?你試過了嗎? – BartoszKP 2014-10-28 23:33:43

+0

修復縮進後,它將起作用(在「if」行末尾沒有冒號,下一行應該縮進)。另外,如果你使用Python <3,使用'xrange()'也應該加速。 – 2014-10-28 23:35:46

+0

除了上面所有相關的評論外,請嘗試。 'timeit'應該這樣做。 https://docs.python.org/2/library/timeit.html – 2014-10-28 23:38:48

回答

1

我想以最快的方式寫這蟒蛇很可能是:

max(some_function(i,j) for i in xrange(1, 1499) for j in xrange(1, i)) 

現在你不range創建不必要的名單,而且大多數的執行將是C代碼,因爲它只是一臺發電機表達式不顯式python循環。

當然,請按照評論者提到的timeit檢查結果。

+0

謝謝wim。是否有任何理由爲什麼會在for循環中使用xrange而不是range?在線搜索,我已經在for循環中收集了它,它是同樣的事情,但迭代更有效,因此更快。 – ploo 2014-10-29 00:14:55

+1

我建議在itertools.combinations(xrange(1,1499),2)'中使用'for j,而不要在生成器表達式中使用兩個'for'子句。 – Blckknght 2014-10-29 00:25:35

+0

如果您不需要生成的列表(除迭代以外),請使用'xrange'。如果你想要列表,例如使用'range'進行索引。 – wim 2014-10-29 10:51:25

0

很酷的東西可以通過使用irange。即:

for i in range(1,1499): 
    for j in range(1,i): 
     candidate = some_function(i,j) 
     if candidate > max_value: 
      max_value = candidate 

另請注意,我在max_value = candidate處修正了一個縮進。