2015-10-16 62 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),今天发生的优化可能很容易在明天改变。