yield是從php5.5開始有的,關於yidle的說明鳥哥的部落格做了詳細說明,我覺得是有點複雜,在看了幾篇其他的帖子還有案例,我大概知道yield的作用就是在做大量資料迴圈處理的時候,能節省很大一部分記憶體~
官方:鳥哥:
參考案例說明yield的作用
<?php //普通模式的**
function generatedata($max)}
echo
'開始前記憶體占用:
'. memory_get_usage() . php_eol;
$data = generatedata(100000
);echo
'生成完陣列後記憶體占用:
'. memory_get_usage() . php_eol;
unset($data);
echo
'釋放後的記憶體占用:
' . memory_get_usage() . php_eol;
# php yield.php
開始前記憶體占用:
387600
生成完陣列後記憶體占用:
387632
釋放後的記憶體占用:
387632
前後使用的記憶體差值為:387632-387600 = 32
# php yield.php
開始前記憶體占用:
386912
生成完陣列後記憶體占用:
387520
釋放後的記憶體占用:
386944
前後使用的記憶體差值為:387520-386912 = 608
明顯608要遠遠大於32,不是說是降低記憶體使用率麼。那麼就把迴圈的數值調大試試。把100000改為10000000
再使用cli模式執行,發現不適用yield會報錯了
php fatal error: allowed memory size of 134217728 bytes exhausted (tried to allocate 134217736 bytes) in /data/wwwroot/default/up_sql.php on line 7
但是yield依然是608,這是因為它自身,它在你進行迭代的時候才會產生真實資料。
所以如果你的資料**非常大,那麼用 yield 吧。如果資料**很小,當然選擇一次載入記憶體。
python 生成器 迭代器,了解一下
generator 生成器,不曉的為什麼這麼叫 用來生產元素的 新建list dict時生成元素 import random m1 for i in range 5 x random.randint 65,123 m1 i print m1 m3 print m3 生成乙個矩陣 li 2d 0 3 ...
python生成器的學習,簡單介紹一下迭代器
從列表生成式開始學起 item 2 for item in range 10 會生成列表 0,1,4,9,16,25,36,49,64,81 為了節省資源,在讀取 使用大量資料時,使用生成器可以節省系統資源,生成器會產生乙個列表,而這個列表中的資料不會一次性讀入記憶體或寫入,而是只記憶其中乙個資料。...
生成器 PHP的生成器yield 原創
在php 5.5中,php多了乙個新的特性,那就是生成器 generator 生成器提供了一種更簡單的方法來實現簡單的物件迭代。下面的manual的引用 生成器提供了一種更容易的方法來實現簡單的物件迭代,相比較定義類實現 iterator 介面的方式,效能開銷和複雜性大大降低。生成器允許你在 for...