[Python] izip, cycle使用

覺得這實在很好用, 把他記錄下來一下

python再itertools裡面有兩個很方便的東西, 一個是izip, 另外一個是cycle

首先izip, 他可以將多個list垂直合併起來使用, 這邊熟悉python的人會覺的不是也有一個zip可以使用嗎?

其實這兩個做的結果一樣, 但是過程有點差異

ex:
from itertools import izip
xl = [1, 5, 10]
yl = [5, 10, 15]
for x, y in izip(xl, yl):
    print x, y

上述程式碼就會(1, 5), (5, 10), (10 ,15)的印出來

那下列這行結果也是一樣
for x, y in zip(xl, yl):
    print x, y

所以以結果來看看不出來差異, 但是在實作上, izip是當存取到那個item, 他才會去合併相對的list item

使用時機是, 假如list已經不小了, 合併會變成超大list, 那可能會造成記憶體吃太多, 而導致out of memory

而其實你只是要存取幾個合併的時候才要的item, 並不用真的完全合併所有list, 那就用izip就好, 可以剩下一些速度跟空間

再來是cycle, 這個東西比較不直觀, 首先使用方式是cycle(iterable), 也就是要傳一個iterable的物件進去

ex:
from itertools import cycle
yl = [5, 10, 15]
for item in cycle(yl):
    print item

你會發現他停不下來, 拼命印, 一直不停的印出5, 10, 15, 5, 10, 15, 5, 10, 15...etc不停重複

原因很簡單, cycle就是會幫你做出一連串重複的結果

所以通常cycle要配合其他東西使用, 下面兩個for-loop舉例

ex:
from itertools import izip, cycle
xl = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
yl = [5, 10, 15]

print "The following is Without cycle"
for a, b in izip(xl, yl):
    print a, b

print "The following is With cycle"
for a, b in izip(xl, cycle(yl)):
    print a, b

這結果就會是
The following is Without cycle
1 5
2 10
3 15
The following is With cycle
1 5
2 10
3 15
4 5
5 10
6 15
7 5
8 10
9 15
10 5
11 10
12 15
13 5
14 10
15 15
16 5
17 10
18 15
19 5
20 10

很明顯, 如果沒有用cycle, 就算我用zip合併list, 也只會印出最小的list的範圍, 如果我用cycle, 他會自動把有用cycle的list延長到跟最長的長度一樣, 而且不停的重複5, 10, 15, 5, 10, 15

留言

張貼留言

這個網誌中的熱門文章

[Linux] Linux下查詢硬體記憶體資訊 Memory Information

[Other] Chrome 重新整理所有開啟頁面

[Python] Simple Socket Server