Javascript ES6在python中的收益率和收益率

时间:2015-10-16 03:13:06

标签: javascript python ecmascript-6

我一直在研究Python和JS一段时间,并希望了解python与ES6中生成器的收益率之间的行为差​​异

在python中使用yield可以节省内存,因为它一次生成1个项目。 ES6的产量是否相同?

1 个答案:

答案 0 :(得分:4)

简短的回答是"是的。"

简化的长答案是"是的,虽然发电机有一些开销(在它不会随着要生成的项目数量而变化的意义上是固定的),这使得节省的数量减少了要生成的项目很小。" (当然,在这种情况下,总费用足够小,无论如何都很重要)

对于长篇答案过于复杂的警告:

CPython(参考Python解释器)对代码的优化很少;它可以在非常有限的情况下进行小的窥视孔优化(例如,它可以在字节代码中将1 + 2 + x转换为3 + x,但由于运算符重载和操作顺序,它不能x + 1 + 2转换为x + 3,因为它不能假定x + 1会返回int,并且它无法知道添加是x无论Array类型是什么类型associative。因此,当您在CPython中使用生成器时,它将始终在运行时作为生成器执行。

相比之下,在大多数现代浏览器中,JavaScript引擎使用JIT-ing将JavaScript代码编译为本机代码;它可以使speculative/adaptive optimizations编译为假定特定类型和值的代码,并且只有在假设失败时才会依赖于解释原始JS。这意味着您无法确切地说出在热循环中执行生成器代码的情况下将会采取什么措施(对于长期节省而言,昂贵的分析和优化将被认为是值得的。)

如果JS引擎确定生成器通常会产生少量可以提前计算的输出,通常是完全消耗的,那么生成过程没有明显的副作用,并且它会更多高效且不太耗费内存,生成本机代码并不能实际创建或运行生成器,而是生成func toDictionary<T:Equatable>(collection:[T]) -> [T:String] { var dict = [T:String]() for item in collection{ print(item) dict[item] = "\(item.dynamicType) \(item)" } return dict } let collection = [1,2,3,4,5] let p = toDictionary(collection) 输出(或者用于数字之类的东西) ES6 typed array以减少内存使用量。我不了解哪些JS引擎(如果有的话)可能尝试执行这样的优化,但考虑到过去七年左右JS引擎的最新技术发展变化(最常用的现代JS引擎是可能至少比2008年9月1日发布V8之前的最快引擎速度快10倍),今天发生的优化很快就会明天改变。