產量我一直在Python和JS了一段時間,並希望瞭解VS在ES6的Javascript ES6產量VS在蟒蛇
使用Python中產量產量爲Python生成器之間的行爲差異可以節省內存,因爲它一次生成1個項目。這對ES6的產量是否一樣?
產量我一直在Python和JS了一段時間,並希望瞭解VS在ES6的Javascript ES6產量VS在蟒蛇
使用Python中產量產量爲Python生成器之間的行爲差異可以節省內存,因爲它一次生成1個項目。這對ES6的產量是否一樣?
簡短回答是「是」。
簡化的長答案是「是的,雖然發電機有一些開銷(固定的意思是它不會隨着要生成的項目的數量而改變),這使得當要生成的項目的數目時儲蓄消失是小。」 (當然,在這種情況下,總成本是不夠,它很少反正重要的小)
過於複雜告誡長回答:
CPython的(參考Python解釋器)做的代碼非常少的優化;它可以在非常有限的情況下進行小窺視孔優化(例如,它可以在字節碼中將1 + 2 + x
轉換爲3 + x
,但由於操作員超載和操作順序,它不能將轉換爲x + 1 + 2
爲x + 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),今天發生的優化可能很容易在明天改變。
yes < - 不能把這個作爲答案,因爲它是一個詞 – slebetman
所以你的意思是在JS中的產量也節省內存,並最好使用? – Praveen
@Kay這取決於你想要做的數字範圍。 Praveen,是的。 – thefourtheye