2010-10-31 24 views
2

這個簡單的聲明:Python的語句使用過量的RAM

zip(xrange(0, 11614321), xrange(0, 11627964)) 

......吃了我的大部分RAM的。 (> 150 MiB!)爲什麼?

編輯:啊,重新閱讀文檔,我看到zip返回一個列表,而不是一個迭代。像zip這樣的返回一個迭代?


的照片放大:我迭代文件數據在兩個大的陣列,以及我正在做的事情等迭代(0端,0端),(0端,1-端)等我不想切片數組,因爲它會導致內存的過度分配。我想我只是迭代索引,但似乎沒有工作,如上所述。整個代碼:

def subsequence_length(data_a, data_b, loc_a, loc_b): 
    length = 0 
    for i_a, i_b in zip(xrange(loc_a, len(data_a)), xrange(loc_b, len(data_b))): 
     if data_a[i_a] == data_b[i_b]: 
      length += 1 
     else: 
      break 
    return length 
+1

@erjang:所以你需要等待一個設定的時間段,然後才能接受回答。現在這段時間已經過期,我接受了nos的回答。在我的其他問題中,我現在每隔一段時間都會看到他們:那些沒有接受答案的人並不是因爲沒有人滿意地回答這個問題。 – Thanatos 2010-10-31 21:26:00

+0

您使用的計算機和操作系統組合是隻有150 MiB的RAM? – martineau 2010-11-01 09:21:51

+0

@martineau:這是一臺Linux筆記本電腦,帶有2個GiB的RAM。那不是重點。只需增加兩個整數即可,甚至不需要千字節,更不用說150MB。 (150 MiB是它在使用之前能夠測量多少,我可以在測量之前測量它的數量,這個特別的聲明實際上是在吞噬我所有的RAM。) – Thanatos 2010-11-02 19:51:42

回答

12

使用izip從itertools

+0

正是我需要的。謝謝! – Thanatos 2010-10-31 19:53:51

3

如果由於某種原因,你不想使用itertools模塊,這將是微不足道的編寫自己的迭代器,做同樣的事情,在至少如果你知道你正在處理兩個輸入迭代器。

def xzip2(i1, i2): 
    i1, i2 = iter(i1), iter(i2) 
    while True: 
     yield next(i1), next(i2) 

其實,在進一步思考,這並不難,使其與任何數目的迭代工作。我相當肯定itertools.izip必須執行這樣的事情。

def xzip(*iters): 
    iters = [iter(i) for i in iters] 
    while True: 
     yield tuple([next(i) for i in iters]) 

(而綜觀the documentation,我看到的是,除了他們使用map而不是list解析)

+1

你應該使用內建'next'函數('next(i1)'),該方法在Python 3中被重命名爲'__next__'。 – adw 2010-10-31 20:14:07

+1

你應該做'i1 = iter(i1); i2 = iter(i2)'在循環之前。 'xrange'是可迭代的,但它本身不是迭代器。 – adw 2010-10-31 20:18:48

+0

兩個好建議。添加。 – kindall 2010-10-31 20:22:08