2015-10-16 60 views
2

產量我一直在Python和JS了一段時間,並希望瞭解VS在ES6的Javascript ES6產量VS在蟒蛇

使用Python中產量產量爲Python生成器之間的行爲差​​異可以節省內存,因爲它一次生成1個項目。這對ES6的產量是否一樣?

+2

yes < - 不能把這個作爲答案,因爲它是一個詞 – slebetman

+0

所以你的意思是在JS中的產量也節省內存,並最好使用? – Praveen

+0

@Kay這取決於你想要做的數字範圍。 Praveen,是的。 – thefourtheye

回答

3

簡短回答是「是」。

簡化的長答案是「是的,雖然發電機有一些開銷(固定的意思是它不會隨着要生成的項目的數量而改變),這使得當要生成的項目的數目時儲蓄消失是小。」 (當然,在這種情況下,總成本是不夠,它很少反正重要的小)

過於複雜告誡長回答:

CPython的(參考Python解釋器)做的代碼非常少的優化;它可以在非常有限的情況下進行小窺視孔優化(例如,它可以在字節碼中將1 + 2 + x轉換爲3 + x,但由於操作員超載和操作順序,它不能將轉換爲x + 1 + 2x + 3,因爲它不能假設x + 1將返回一個int,並且它不知道associative的增加是什麼類型x原來是)。因此,當您在CPython中使用生成器時,它將始終在運行時作爲生成器執行。相比之下,在大多數現代瀏覽器中,JavaScript引擎使用JIT-ing將JavaScript代碼編譯爲本機代碼;它可以使speculative/adaptive optimizations編譯爲假定特定類型和值的代碼,並且只有在假設失敗時纔會解釋原始JS。這意味着您無法確切地說出在發生器代碼在熱循環中執行的情況下(如果爲了長期節約而認爲昂貴的分析和優化是值得的),將會執行什麼操作。

如果JS引擎確定生成器通常會生成少量可以提前計算的輸出,這通常會被完全消耗,生成過程沒有可見的副作用,並且它會是更高效且不會佔用過多內存,完全可以產生本地代碼,但實際上並不會創建或運行生成器,而是生成輸出的Array(或用於數字等東西,可能是ES6 typed array以減少內存使用情況)。我沒有洞察到哪些JS引擎可能嘗試執行這樣的優化,但考慮到過去七年左右JS引擎的狀態發生了怎樣的變化(最慢的常用現代JS引擎是可能至少比2008年9月1日發佈的最快引擎快10倍,然後發佈V8),今天發生的優化可能很容易在明天改變。