2014-11-17 26 views
2

我是通過我的一些舊的代碼閱讀和跨越這條線進來使用嵌套迭代器是否有意義?

itertools.starmap(lambda x,y: x + (y,), 
        itertools.izip(itertools.repeat(some_tuple, 
                len(list_of_tuples)), 
           itertools.imap(lambda x: x[0], 
               list_of_tuples))) 

要清楚,我有一些list_of_tuples從中我想要得到的第一個項目出來的每個元組(該itertools.imap),我有另一個我想重複的元組(itertools.repeat),以便list_of_tuples中的每個元組都有一個副本,然後我想根據list_of_tuplesitertools.starmap)中的項獲取新的更長的元組。例如,假設some_tuple = (1, 2, 3)list_of_tuples = [(1, other_info), (5, other), (8, 12)]。我想要類似[(1, 2, 3, 1), (1, 2, 3, 5), (1, 2, 3, 8)]。這不是確切的IO(它使用了一些非常不相關和複雜的類),我的實際列表和元組非常大。

是否有點像這樣嵌套迭代器?在我看來,像itertools中的每個函數都必須迭代我給它的迭代器,並在某處存儲信息,這意味着將其他迭代器放在starmap內部沒有任何好處。我完全錯了嗎?這個怎麼用?

+0

如果您向我們展示預期的輸入和輸出將很好地映射您的工作 – Hackaholic

+0

不,原因很簡單,它使代碼太難遵循。保持簡單 –

+0

@gnibbler就像它可能,甚至刪除它仍然得到我們嵌套迭代器,所以除非刪除它改變了答案,我仍然想知道是否有一個點在嵌套一般 – Dannnno

回答

2

沒有理由嵌套迭代器性能上的優勢。使用變量不會對性能/內存產生顯着影響:

first_items = itertools.imap(lambda x: x[0], list_of_tuples) 
repeated_tuple = itertools.repeat(some_tuple, len(list_of_tuples)) 
items = itertools.izip(repeated_tuple, first_items) 
result = itertools.starmap(lambda x,y: x + (y,), items) 

使用,並返回由itertools不存儲在內存中的所有項目的迭代器對象,但在需要時簡單地計算下一個項目。你可以閱讀更多關於他們如何工作here

+0

我認爲這真的是我的問題所要求的。我不確定如果不嵌套迭代器,我最終會在內存中存儲比我想要的更多的東西。謝謝! – Dannnno

1

我不認爲在這種情況下上面的組合是必要的。

它似乎是等效於本發生器表達式:

(some_tuple + (y[0],) for y in list_of_tuples) 

但是偶爾itertools可以具有尤其是在CPython的

+0

因此,忽略我給出的例子,我可以看到它並不是一個好的例子,一般而言,迭代器的嵌套對程序的性能有任何正面影響或其他影響。或者這種情況需要逐案確定? – Dannnno

+2

@Dannnno,你應該更喜歡用最可讀的方式編寫代碼。如果事實證明是一個性能瓶頸,你可以用你認爲更快的方式重寫它。保留易於閱讀的版本作爲文檔。您可以針對兩個版本編寫單元測試,以檢測您的更快版本中的行爲是否發生了意外更改 –