gpt4 book ai didi

Ruby 的 `lazy` 性能不如分配巨大的列表?

转载 作者:数据小太阳 更新时间:2023-10-29 07:27:55 26 4
gpt4 key购买 nike

我正在尝试处理大量数字:

require 'benchmark'

N = 999999

Benchmark.bm 10 do |bm|
bm.report 'Eager:' do
(0..N).select(&:even?).map{|x| x * x}.reduce(&:+)
end
bm.report 'Lazy:' do
(0..N).lazy.select(&:even?).map{|x| x * x}.reduce(&:+)
end
end;

根据我的理解,惰性版本应该快得多,因为急切版本需要分配两个列表,每个列表有 50 万个项目(一个用于 select 一个用于 map) 而惰性版本正在流式传输所有内容。

但是,当我运行它时,惰性版本的时间是热切版本的两倍多! ( http://rextester.com/OTEX7399 )

         user     system      total        real
Eager: 0.210000 0.010000 0.220000 ( 0.216572)
Lazy: 0.580000 0.000000 0.580000 ( 0.635091)

怎么可能呢?

最佳答案

我会说枚举器是一个比内存慢得多的中间人。

这也是 reported不久前和 Ruby 核心团队成员 Yusuke Endoh said :

Enumerator::Lazy is not a silver bullet; it removes the overhead for creating an intermediate array, but brings the drawback for calling a block. Unfortunately, the latter is much bigger than the former. Thus, in general, Lazy does bring performance drawback.


我刚刚想到的一个类比:假设您正在为 friend 制作家具。

  • 不懒惰:您自己 build 整个东西,租一辆卡车,然后开给您的 friend 。

  • 懒惰:您构建了一个小部件,然后用您的车开给您的 friend 。你 build 下一个小部件,然后用你的 Handlebars 它开给你的 friend 。你 build 下一个小部件,然后用你的 Handlebars 它开给你的 friend 。等等。

是的,租那辆卡车是额外的开销,但与用你的车一次又一次地驾驶相比,这算不了什么。

懒惰可以节省时间的真正原因是,在最初的几件作品之后,你的 friend 发现你和他的妻子睡过,所以现在你们不再是 friend ,他不再想要你的愚蠢家具,而你'我们根本不构建剩余部分。

关于Ruby 的 `lazy` 性能不如分配巨大的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47653131/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com