2018/03/29

Generators

目前我學的三個語言都有支援 generators,一般來說我們會用 foreach 去跑 Iterator,假設我們創建了一個極大的 array variable,非常佔用記憶體,而 generators 的出現就是解決這個問題,當你真的要取值時才使用 yield 吐出資料,最常見的範例就是爬檔案了,一般寫法是把檔案內容整個讀進來 memory,然後你在對他進行 iterator 的訪問,假設該檔案有五萬行資料,你的東西在第十筆就找到了,那剩下的四萬多筆資料只是單純浪費記憶體空間而已,接下來實做三個語言的 generators 用法

PHP

<?php

function go($length)
{
    for ($i = 0; $i < $length; $i++) {
        yield $i;
    }
}

foreach (go(10) as $value) {
    echo $value, PHP_EOL;
}

node.js

function* go(length) {
    for (let i = 0; i < length; i++) {
        yield i;
    }
}

for (value of go(10)) {
    console.log(value);
}

python

def go(length):
    for value in range(10):
        yield value


for value in go(10):
    print(value)

上面的程式執行後都會得到 0-9,而 python 在這個部份有很多變化,像是可以用 xrange 這個 function 拿到一個 generator 的結果,寫法也比較多變化

x = [v for v in range(10)]
print(x)

# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

x = (v for v in range(10))
print(x)

# <generator object <genexpr> at 0x7fe2b60916e0>

for value in x:
    print(value)

# 0 1 2 3 4 5 6 7 8 9

沒有留言: