ckclark's Blog

Errors = more code2

itertools.product will cause MemoryError

使用itertools.product的時候請小心MemoryError

雖然當其中一個或全部參數都是無窮數列的時候理論上也是能跑出結果
不過itertools.product的行為會需要重跑其中的iterable (不一定所有傳進來的iterable都是能夠重跑的 也不見得重跑會有一樣結果)
所以實作上就會試著先把傳進來的iterable都變成tuple暫存起來
那當其中一個是無窮數列的時候 就爆炸囉
順帶一提 我的情況是需要建出(0, 1, 2, 3, ...) x 'ABCD' => (0A, 0B, 0C, 0D, 1A, 1C, ...) 直到第n個item
原本想法是用

for (letter, idx), _ in zip(product(itertools.count(), 'ABCD'), xrange(n)):
    print letter, idx

結果就當掉 連滑鼠都沒反應 只好hard reset GG
解法大概就把itertools.count()改成xrange(n / 4 + 1)之類囉

ref1: [SO]Why do I get a MemoryError with itertools.product?
ref2: python source: itertoolsmodule.c#l1854

Comments