2011-04-19 51 views
0

在我正在運行的腳本中,存在內存泄漏問題(由於正在使用專有軟件),導致腳本無法運行超過325k次迭代。爲了解決這個問題,我創建值的列表它通過在for循環遍歷像這樣:如何創建一個遞增的範圍計數器?

squery = 
['OBJECTID >=0 AND OBJECTID <=300000', 
'OBJECTID >=300001 AND OBJECTID <=600000', 
'OBJECTID >=600001 AND OBJECTID <=900000', 
.... 
'OBJECTID >=8700001 AND OBJECTID <=8766184'] 

for query in squery: 
    do work 

是否有這樣的名單可以在運行時建創在300K間隔這些範圍的方法間隔,直到值達到X?如在900k記錄中有3個區間,在150萬個記錄中有5個區間。

回答

4
squery = 
['OBJECTID>=%s AND OBJECTID<=%s' % (i*300k+(i!=0),(i+1)*300k) for i in range(0,3)] 

(300K = 300 000和間隔的數量是在range(0,*3*)

+0

完美,謝謝。我不知道你可以用這種方式創建列表! – Nathanus 2011-04-19 20:57:07

+0

它被稱爲'list comprehensions':http://docs.python.org/tutorial/datastructures.html#list-comprehensions – manji 2011-04-19 20:58:33

+0

我很熟悉這些,只是沒有使用它們的這種方法。總是有更多要學習。 – Nathanus 2011-04-19 21:00:18

1

只是爲了完整性,發電機也將很好地解決這個問題:

def generator_function(n): 
    for i in range(0,n): 
     yield ('OBJECTID>=%s AND OBJECTID<=%s' % (i*300000+(i!=0),(i+1)*300000)) 

# now use it: 
for each_string in generator_function(3): 
    print each_string 

此方法對生成的每個字符串在某些情況下可能更可取(例如,如果您想要生成大量字符串而不僅僅是5個字符 - 在這種情況下,itertools是生成器的良好伴侶)。

+0

感謝您的替代方法。 – Nathanus 2011-04-19 22:11:50