Javascript ES6中的yield和Python中的yield有什么区别?

5

我已经在Python和JS上工作了一段时间,想要了解Python中生成器的yield与ES6中的yield之间行为差异

在Python中使用yield可以节省内存,因为它每次只生成1个项目。ES6中的yield是否也是这样呢?


4
是的 - slebetman
那么你的意思是JS中的yield也可以节省内存,使用起来更可取吗? - Praveen
@Kay 这取决于您想要对数字范围做什么。Praveen,是的。 - thefourtheye
相比于什么来说可以节省内存?ECMA-262没有定义实现,因此不同的实现可能对不同的事物使用不同数量的内存。 - RobG
1个回答

4
简短回答是“Yes”。
简化的长回答是“是的,尽管生成器有一些开销(固定的,它不会随着要生成的项目数量的增加而改变),当要生成的项目数量很少时,这些节省就会消失。”(但当然,在这种情况下,总成本足够小,很少有影响)
过于复杂的长回答附加说明:
CPython(参考Python解释器)对代码进行非常少的优化;它可以在非常有限的情况下进行小型的Peephole优化(例如,它可以将1 + 2 + x 转换为3 + x 在字节码中,但由于运算符重载和操作顺序,它不能将x + 1 + 2 转换为x + 3 ,因为它不能假设x + 1 将返回一个int,并且它不能知道加法对于x所代表的任何类型来说是否具有结合律)。因此,当您在CPython中使用生成器时,它将始终作为生成器在运行时执行。
相比之下,在大多数现代浏览器中,JavaScript引擎使用JIT-ing将JavaScript代码编译成本地代码;它可以进行推测/自适应优化,其中编译为假定特定类型和值的代码,并在假设失败时回退到解释原始JS。这意味着在生成器代码在热循环中执行时,你无法确定会发生什么(在长期节省方面,昂贵的分析和优化被认为是值得的)。
如果JS引擎确定生成器通常产生少量可预先计算、通常完全消耗的输出,并且生成过程没有可见的副作用,并且更高效且不太占用内存,那么它有权生成实际上不创建或运行生成器而是生成一个输出数组(或对于诸如数字之类的东西,可能是ES6中的 类型化数组 以减少内存使用)的本机代码。我不知道哪些JS引擎,如果有的话,可能会尝试执行这样的优化,但考虑到在过去七年左右的时间里JS引擎的最新技术状态已经发生了多么快速的变化(最慢的常用现代JS引擎可能至少比2008年9月1日之前 V8 发布的最快引擎快10倍),今天发生的优化明天就可能改变。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接