摘要:生成器的內部一直在停頓和恢復之間切換,直到循環完成或停頓位置缺點生成器不能滿足所有迭代器的需求,因為如果不查詢,生成器永遠不知道下一個要迭代的值是什么,在生成器中無法后退或前進。
一.迭代器
分析:想一下,如果把集合對象和對集合對象的操作放在一起,當我們想換一種方式遍歷集合對象中元素時,就需要修改集合對象了,違背“單一職責原則”,而迭代器模式將數據結構和數據結構的算法分離開,兩者可獨立發展。
優點:
支持多種遍歷方式。比如有序列表,我們根據需要提供正序遍歷、倒序遍歷兩種迭代器。用戶只需要得到我們的迭代器,就可以對集合執行遍歷操作
簡化了聚合類。由于引入了迭代器,原有的集合對象不需要自行遍歷集合元素了
增加新的聚合類和迭代器類很方便,兩個維度上可各自獨立變化
為不同的集合結構提供一個統一的接口,從而支持同樣的算法在不同的集合結構上操作
缺點:
迭代器模式將存儲數據和遍歷數據的職責分離增加新的集合對象時需要增加對應的迭代器類,類的個數成對增加,在一定程度上增加系統復雜
具體接口:
Iterator extends Traversable { /* 方法 */ abstract public mixed current ( void ) abstract public scalar key ( void ) abstract public void next ( void ) abstract public void rewind ( void ) abstract public bool valid ( void ) }
簡單的foreach迭代器實現
position = 0; } function rewind() { var_dump(__METHOD__); $this->position = 0; } function current() { var_dump(__METHOD__); return $this->array[$this->position]; } function key() { var_dump(__METHOD__); return $this->position; } function next() { var_dump(__METHOD__); ++$this->position; } function valid() { var_dump(__METHOD__); return isset($this->array[$this->position]); } } $it = new myIterator; foreach($it as $key => $value) { var_dump($key, $value); echo " "; } ?>二.生成器
PHP生成器(generator)是PHP5.5.0引入的功能,與標準的PHP迭代器不同,PHP生成器不要求類實現Iterator接口,從而減輕了類的負擔,生成器會根據需求計算并產出要迭代的值,這對性能有重大的影響試想一下假如標準的PHP迭代器經常在內存中執行迭代操作者要預先計算出數據集性能低下;如果要使用特定的的方式對計算大量數據,對性能的影響更甚。此時我們可以使用生成器,即時計算產出后續值不占用寶貴的內存資源。
優點:
占用內存少對,性能好。每次產出一個值之后,生成器的內部狀態都會停頓;當生成器請求下一個值時,內部狀態又會恢復。生成器的內部一直在停頓和恢復之間切換,直到循環完成或停頓位置
缺點:
PHP生成器不能滿足所有迭代器的需求,因為如果不查詢,生成器永遠不知道下一個要迭代的值是什么,在生成器中無法后退或前進。
生成器還是一次性的,無法多次迭代同一個生成器,不過,如果需要,可以重建或克隆生成器。
?
創建生成器:
因為生成器就是PHP函數,生成器就是在函數中使用yield關鍵字。與普通的PHP函數不同的是,生產器從不返回值,只產出值。
調用生成器函數時,PHP會返回一個屬于Generator類的對象。
這個對象可以使用foreach()函數迭代。每次迭代,PHP會要求Generator實例計算并提供下一個要迭代的值如上所示:
當$length 很大時(上百萬),而且你同時沒有使用生成器的話,那么就要預先為一個由一百萬上一千五個整數組成的數組分配內存。而PHP生成器能實現相同的操作,不過一次只會為一個整數分配內存
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29442.html
文章內容主要是詳細介紹了pythonmemory_profiler庫制作器和迭代器cpu占用的時間分析,文章內容緊扣主題進行詳盡的基本介紹,感興趣的朋友可以了解一下 不進行計算時,生成器和list空間占用 importtime frommemory_profilerimportprofile profile(precision=4) deflist_fun(): start...
摘要:我個人認為迭代器和生成器是新增的特性里面,非常重要的部分,充分地掌握和使用迭代器和生成器,是十分必要和重要的,所以我會寫關于二者的一系列文章。 我個人認為迭代器和生成器是es6新增的特性里面,非常重要的部分,充分地掌握和使用迭代器和生成器,是十分必要和重要的,所以我會寫關于二者的一系列文章。話不多說,先來了解一下基本概念:一:什么是迭代器 1: 迭代器是一個對象 2: 迭代器有一個屬性...
摘要:來說說迭代器和生成器,還有可迭代對象和生成器表達式。有點繞是不是,其實,一般只要知道可迭代對象以及它是如何實現的就行了,中常常用生成器來代替迭代器,可以說,生成器就是迭代器。 來說說迭代器和生成器,還有可迭代對象和生成器表達式。 之前簡單的提到過,一個對象是可迭代的可以理解為能夠使用for循環。這樣說其實不太準確,某個對象可迭代是因為它內部實現了$__iter__$這個特殊方法。比如在...
摘要:本文重點掌握可迭代的對象的定義掌握可迭代對象迭代器與生成器之間的關系和異同熟悉標準庫中生成器。二迭代器迭代器介紹迭代器用于從集合中取出元素的對象。若想再次迭代須重建迭代器。迭代器檢查方式調用,。區別可迭代的對象不是迭代器。 導語:本文章記錄了本人在學習Python基礎之控制流程篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學習并交流。 本文重點: 1、掌握可迭代的對象的...
摘要:迭代器迭代器用于循環構建和擴展集合類型逐行遍歷文本文件列表推導字典推導和集合推導元組拆包調用函數時,使用拆包實參解釋器需要迭代對象時,會自動調用內置的函數,有以下功能檢查對象是否實現了方法,如果實現了就調用它,獲取一個迭代器。 迭代器 迭代器用于: for 循環 構建和擴展集合類型 逐行遍歷文本文件 列表推導、 字典推導和集合推導 元組拆包 調用函數時, 使用 * 拆包實參 解釋器...
閱讀 3616·2021-11-24 10:22
閱讀 3686·2021-11-22 09:34
閱讀 2480·2021-11-15 11:39
閱讀 1528·2021-10-14 09:42
閱讀 3662·2021-10-08 10:04
閱讀 1553·2019-08-30 15:52
閱讀 847·2019-08-30 13:49
閱讀 3015·2019-08-30 11:21