簡單了解一下php的迭代生成器yield

2022-03-23 00:18:12 字數 1240 閱讀 5474

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...