Suche senden
Hochladen
怠惰なRubyistへの道
•
4 gefällt mir
•
1,320 views
nagachika t
Folgen
みなとRuby会議01での発表資料の配布版
Weniger lesen
Mehr lesen
Technologie
Melden
Teilen
Melden
Teilen
1 von 65
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01
nagachika t
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
Ryo Sakamoto
Boost Tour 1.50.0 All
Boost Tour 1.50.0 All
Akira Takahashi
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
Tomoya Kawanishi
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
Takuro Iizuka
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
MITSUNARI Shigeo
llvm入門
llvm入門
MITSUNARI Shigeo
Empfohlen
怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01
nagachika t
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
Ryo Sakamoto
Boost Tour 1.50.0 All
Boost Tour 1.50.0 All
Akira Takahashi
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
Tomoya Kawanishi
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
Takuro Iizuka
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
MITSUNARI Shigeo
llvm入門
llvm入門
MITSUNARI Shigeo
Popcntによるハミング距離計算
Popcntによるハミング距離計算
Norishige Fukushima
Boost.SIMD
Boost.SIMD
Akira Takahashi
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
Takeshi Yamamuro
boost tour 1.48.0 all
boost tour 1.48.0 all
Akira Takahashi
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
C++0x in programming competition
C++0x in programming competition
yak1ex
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
MITSUNARI Shigeo
深層学習 Day1レポート
深層学習 Day1レポート
taishimotoda
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Kohsuke Yuasa
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
MITSUNARI Shigeo
新しい並列for構文のご提案
新しい並列for構文のご提案
yohhoy
constexpr idioms
constexpr idioms
fimbul
R-hpc-1 TokyoR#11
R-hpc-1 TokyoR#11
Shintaro Fukushima
Metaprogramming in JuliaLang
Metaprogramming in JuliaLang
Yuichi Motoyama
Emcjp item33,34
Emcjp item33,34
MITSUNARI Shigeo
深層学習フレームワークChainerの紹介とFPGAへの期待
深層学習フレームワークChainerの紹介とFPGAへの期待
Seiya Tokui
Juliaで並列計算
Juliaで並列計算
Shintaro Fukushima
Ruby Kaja のご提案
Ruby Kaja のご提案
nagachika t
CRuby Committers Who's Who in 2013
CRuby Committers Who's Who in 2013
nagachika t
Ruby on azure で game server service
Ruby on azure で game server service
nagachika t
Magellan on Google Cloud Platform
Magellan on Google Cloud Platform
nagachika t
CRuby_Committers_Whos_Who_in_2014
CRuby_Committers_Whos_Who_in_2014
nagachika t
Weitere ähnliche Inhalte
Was ist angesagt?
Popcntによるハミング距離計算
Popcntによるハミング距離計算
Norishige Fukushima
Boost.SIMD
Boost.SIMD
Akira Takahashi
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
Takeshi Yamamuro
boost tour 1.48.0 all
boost tour 1.48.0 all
Akira Takahashi
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
C++0x in programming competition
C++0x in programming competition
yak1ex
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
MITSUNARI Shigeo
深層学習 Day1レポート
深層学習 Day1レポート
taishimotoda
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Kohsuke Yuasa
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
MITSUNARI Shigeo
新しい並列for構文のご提案
新しい並列for構文のご提案
yohhoy
constexpr idioms
constexpr idioms
fimbul
R-hpc-1 TokyoR#11
R-hpc-1 TokyoR#11
Shintaro Fukushima
Metaprogramming in JuliaLang
Metaprogramming in JuliaLang
Yuichi Motoyama
Emcjp item33,34
Emcjp item33,34
MITSUNARI Shigeo
深層学習フレームワークChainerの紹介とFPGAへの期待
深層学習フレームワークChainerの紹介とFPGAへの期待
Seiya Tokui
Juliaで並列計算
Juliaで並列計算
Shintaro Fukushima
Was ist angesagt?
(17)
Popcntによるハミング距離計算
Popcntによるハミング距離計算
Boost.SIMD
Boost.SIMD
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
boost tour 1.48.0 all
boost tour 1.48.0 all
プログラムを高速化する話
プログラムを高速化する話
C++0x in programming competition
C++0x in programming competition
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
深層学習 Day1レポート
深層学習 Day1レポート
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
新しい並列for構文のご提案
新しい並列for構文のご提案
constexpr idioms
constexpr idioms
R-hpc-1 TokyoR#11
R-hpc-1 TokyoR#11
Metaprogramming in JuliaLang
Metaprogramming in JuliaLang
Emcjp item33,34
Emcjp item33,34
深層学習フレームワークChainerの紹介とFPGAへの期待
深層学習フレームワークChainerの紹介とFPGAへの期待
Juliaで並列計算
Juliaで並列計算
Andere mochten auch
Ruby Kaja のご提案
Ruby Kaja のご提案
nagachika t
CRuby Committers Who's Who in 2013
CRuby Committers Who's Who in 2013
nagachika t
Ruby on azure で game server service
Ruby on azure で game server service
nagachika t
Magellan on Google Cloud Platform
Magellan on Google Cloud Platform
nagachika t
CRuby_Committers_Whos_Who_in_2014
CRuby_Committers_Whos_Who_in_2014
nagachika t
BigQuery case study in Groovenauts & Dive into the DataflowJavaSDK
BigQuery case study in Groovenauts & Dive into the DataflowJavaSDK
nagachika t
Functional Music Composition
Functional Music Composition
nagachika t
Andere mochten auch
(7)
Ruby Kaja のご提案
Ruby Kaja のご提案
CRuby Committers Who's Who in 2013
CRuby Committers Who's Who in 2013
Ruby on azure で game server service
Ruby on azure で game server service
Magellan on Google Cloud Platform
Magellan on Google Cloud Platform
CRuby_Committers_Whos_Who_in_2014
CRuby_Committers_Whos_Who_in_2014
BigQuery case study in Groovenauts & Dive into the DataflowJavaSDK
BigQuery case study in Groovenauts & Dive into the DataflowJavaSDK
Functional Music Composition
Functional Music Composition
Ähnlich wie 怠惰なRubyistへの道
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
mganeko
Boost tour 1_40_0
Boost tour 1_40_0
Akira Takahashi
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
啓 小笠原
Python で munin plugin を書いてみる
Python で munin plugin を書いてみる
ftnk
多次元配列の効率的利用法の検討
多次元配列の効率的利用法の検討
Yu Sato
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
Satoshi imai
不安定な環境の中でのバッチ処理~JobQueueシステムQudoを使った事例~
不安定な環境の中でのバッチ処理~JobQueueシステムQudoを使った事例~
Akabane Hiroyuki
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
MITSUNARI Shigeo
Tottoruby 20130119
Tottoruby 20130119
Takashi SAKAGUCHI
Wavelet matrix implementation
Wavelet matrix implementation
MITSUNARI Shigeo
Or seminar2011final
Or seminar2011final
Mikio Kubo
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
Taku Miyakawa
フィボナッチ数列の作り方
フィボナッチ数列の作り方
Tomoya Kawanishi
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
nkazuki
続・ゲンバのSwift
続・ゲンバのSwift
Yuichi Adachi
Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015
Ryosuke Okuta
フラグを愛でる
フラグを愛でる
MITSUNARI Shigeo
Rの高速化
Rの高速化
弘毅 露崎
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
Muneyoshi Suzuki
Ruby 2.5
Ruby 2.5
Masahiro Tomita
Ähnlich wie 怠惰なRubyistへの道
(20)
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Boost tour 1_40_0
Boost tour 1_40_0
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
Python で munin plugin を書いてみる
Python で munin plugin を書いてみる
多次元配列の効率的利用法の検討
多次元配列の効率的利用法の検討
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
不安定な環境の中でのバッチ処理~JobQueueシステムQudoを使った事例~
不安定な環境の中でのバッチ処理~JobQueueシステムQudoを使った事例~
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
Tottoruby 20130119
Tottoruby 20130119
Wavelet matrix implementation
Wavelet matrix implementation
Or seminar2011final
Or seminar2011final
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
フィボナッチ数列の作り方
フィボナッチ数列の作り方
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
続・ゲンバのSwift
続・ゲンバのSwift
Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015
フラグを愛でる
フラグを愛でる
Rの高速化
Rの高速化
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
Ruby 2.5
Ruby 2.5
Mehr von nagachika t
Make Ruby Differentiable
Make Ruby Differentiable
nagachika t
All bugfixes are incompatibilities
All bugfixes are incompatibilities
nagachika t
Inspection of CloudML Hyper Parameter Tuning
Inspection of CloudML Hyper Parameter Tuning
nagachika t
Ruby trunk changes 統計版
Ruby trunk changes 統計版
nagachika t
Pd Kai#3 Startup Process
Pd Kai#3 Startup Process
nagachika t
Pd Kai#2 Object Model
Pd Kai#2 Object Model
nagachika t
Mehr von nagachika t
(6)
Make Ruby Differentiable
Make Ruby Differentiable
All bugfixes are incompatibilities
All bugfixes are incompatibilities
Inspection of CloudML Hyper Parameter Tuning
Inspection of CloudML Hyper Parameter Tuning
Ruby trunk changes 統計版
Ruby trunk changes 統計版
Pd Kai#3 Startup Process
Pd Kai#3 Startup Process
Pd Kai#2 Object Model
Pd Kai#2 Object Model
Kürzlich hochgeladen
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
Toru Tamaki
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
WSO2
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
CRI Japan, Inc.
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
CRI Japan, Inc.
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
atsushi061452
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
sn679259
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Hiroshi Tomioka
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
Toru Tamaki
Kürzlich hochgeladen
(11)
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
怠惰なRubyistへの道
1.
怠惰なRubyistへの道 Enumerator::Lazyの使いかた
Chikanaga Tomoyuki (@nagachika) Yokohama.rb 1
2.
Agenda Enumerable Enumerator Enumerator::Lazy
2
3.
WARNING 今日の話は Ruby
2.0 の 新機能について 3
4.
Ruby 2.0 2013年リリース予定 [ruby-dev:44691] より Aug.
24 2012: big-feature freeze Oct. 24 2012: feature freeze Feb. 24 2013: 2.0 release Ruby の生誕 20 周年 4
5.
Ruby 2.0 未来の話
5
6.
2.0 is in
development ※注※ 仕様は開発中のものであり リリース版では変更される場合があります 6
7.
Install Ruby 2.0 未来を手中に rvm,
rbenv を使っていれば rvm install ruby-head rbenv install 2.0-devel 7
8.
Ruby 2.0 for
Windows 8
9.
Self Introduction twitter id:
@nagachika ruby trunk changes (http://d.hatena.ne.jp/nagachika) CRuby committer Yokohama.rb → 福岡遠征中 Sound.rb(ruby-coreaudio, ruby-puredata) 9
10.
Enumerator::Lazy
10
11.
Enumerator::Lazy の前に
11
12.
Enumerable
12
13.
Enumerable もちろん使ってますよね?
13
14.
Array, Hash, IO... Array
や Hash, IO は Enumerable を include している 14
15.
Enumerable 【形容詞】 数えられる
[日本語 WordNet(英和)) 可算;可付番 [クロスランゲージ 37分野専門語辞書] Capable of being enumerated; countable [Wikitionary] 15
16.
Enumerable 「each メソッドを呼ぶと、何かが 順に(N回) yield
で渡される」 というルール(N >= 0) 16
17.
Enumerable each メソッドが定義されて いるクラスに include
して 使う(Mix-in) 17
18.
Enumerable each だけ用意しておけば map, select,
reject, grep, etc... といったメソッドが使えるようになる (これらのメソッドが each を使って 実装されている) 18
19.
An Example class A
include Enumerable def each yield 0 yield 1 yield 2 end end A.new.map{|i| i * 2 } # => [ 0, 2, 4 ] 19
20.
ここまでのまとめ Enumerable は each
メソッドを使って 多彩なメソッドを追加する なにが「数え上げられる」のかは each メソッドがどのように yield を呼び出すかで決まる 20
21.
Enumerator 使ってます?
21
22.
Enumerator each に渡すブロックを保留した 状態でオブジェクトとして持ち回す
22
23.
to_enum, enum_for Enumerator の作りかた •
Enumerator.new(obj, method=:each, *args) • obj.to_enum(method=:each, *args) • obj.enum_for(method=:each, *args) • Enumerator.new{|y| ...} ↑これだけちょっと特殊 23
24.
Object#enum_for each 以外の任意のメソッドの呼び出しを Enumerator にできる (実は
Enumerable でなくてもいい) e_byte = $stdin.enum_for(:each_byte) => バイトごとに yield e_line = $stdin.enum_for(:each_line) => 行ごとに yield 24
25.
Enumerator.new{|y|} e =
Enumerator.new{|y| y << 0 y << :foo y << 2 } ブロックが each の代わり。 ブロックパラメータ y に << すると yield することになる。 25
26.
Enumerator.new{|y|} class A
def each yield 0 yield :bar yield 2 end end A.new.to_enum と同じ 26
27.
Enumerator as External
Iterator 外部イテレータとして使える e = (0..2).to_enum e.next # => 0 each が yield する値が e.next # => 1 順に next で取り出せる e.next # => 2 e.next => StopIteration: iteration reached an end 27
28.
Method Chain map, select
など一部のメソッドはブロッ クを省略すると Enumerator を返すので 複数のメソッドを組み合わせて使う ary.map.with_index { |v,i| ... } 28
29.
Method Chain [:a, :b,
:c, :d].map.with_index do |sym, i| i.even? ? sym : i end => [:a, 1, :c, 3] Enumerator 独自のメソッド 29
30.
with_index [ruby-dev:31953] Matz wrote...
mapがenumeratorを返すと obj.map.with_index{|x,i|....} ができるのが嬉しいので導入したのでした。というわけで、 * eachにもmapにもwith_indexが付けられて嬉しい というのが本当の理由です。 30
31.
Secret Story of
Enumerator. Enumerator は with_index の為に 生まれた! というのは嘘ですが 主な用途は with_index の ためのような気がします 31
32.
ここまでのまとめ • Enumerator • Object#to_enum,
enum_for • 外部イテレータ化 • Method Chain • 32
33.
Enumerator::Lazy 2.0 の新機能
33
34.
Enumerator::Lazy Enumeratorのサブクラス
34
35.
Enumerable#lazy Enumerator::Lazy の作りかた Enumerable#lazy を呼ぶ >>
(0..5).lazy => #<Enumerator::Lazy: 0..5> 35
36.
Enumerator::Lazy Lazyのmap,select,zipなど一部のメソッ ドがさらにLazyを返す >> (0..5).lazy.map{|i| i
* 2} => #<Enumerator::Lazy: #<Enumerator::Lazy: 0..5>:map> 36
37.
Enumerator::Lazy > Enumerator::Lazy.instance_methods(false)
map collect flat_map collect_concat select find_all reject grep zip take take_while drop drop_wihle cycle lazy force [ruby 2.0.0dev (2012-05-30 trunk 35844)] 37
38.
force Enumrator::Lazy#force to_a の alias 遅延されているイテレータの評価を実行
38
39.
A Lazy Demo >>
l = (0..5).lazy => <Enumerator::Lazy: 0..5> >> l_map = l.map{|i| p i; i * 2 } => <Enumerator::Lazy: #<Enumerator::Lazy: 0..5>:map> # この時点ではまだブロックの内容は実行されていない! >> l_map.force 0 1 2 3 4 5 => [0, 2, 4, 6, 8, 10] # force を呼ぶと実行される 39
40.
Enumeratorとの違い Method Chain の使いかたがより強力に 中間データの抑制
40
41.
Pitfall of
Enumerator (1) map, select のようにブロックの戻り値 を利用するメソッドを複数繋げることがで きない(しても意味がなくなる) (0..5).map.select{|i| i % 2 == 0 } => [ 0, 2, 4 ] ↑ map の意味がなくなっている 41
42.
True Method Chain map
や select といったメソッドもいくつでも Method Chain できる。 そう、Lazy ならね。 # 1 から 1000 のうち任意の桁に7を含む数を返す (1..1000).lazy.map(&:to_s).select{|s| /7/ =~ s }.force 42
43.
Pitfall of
Enumerator (2) map, select のようにブロックの戻り値 を利用するメソッドを外部イテレータ化し ても意味がない e = (0..5).select e.next # => 0 e.next # => 1 e.next # => 2 e.next # => 3 ↑ select の意味がなくなっている 43
44.
True External
Iterator map などにブロックを渡せるので 適用した結果を順に取り出せる l = (0..5).lazy.select{|i| i.even? } l.next # => 0 l.next # => 2 l.next # => 4 l.next # => StopIteration: iteration reached an end 44
45.
Efficient Memory
Usage Lazy は yield 毎に Method Chain の 最後まで処理される 45
46.
Enumerable version large_array.map{...}.select{...}
46
47.
Enumerable version large_array.map{...}.select{...}
map 47
48.
Enumerable version large_array.map{...}.select{...}
map select 48
49.
Enumerable version large_array.map{...}.select{...}
GCされる map select 49
50.
Enumerable version large_array.map{...}.select{...}
GCされる map select map 結果のため large_array と同じくらいの 中間データが必要 50
51.
Lazy version large_array.lazy.map{...}.select{...}.force
51
52.
Lazy version large_array.lazy.map{...}.select{...}.force
52
53.
Lazy version large_array.lazy.map{...}.select{...}.force
GC ed 53
54.
Lazy version large_array.lazy.map{...}.select{...}.force
54
55.
Lazy version large_array.lazy.map{...}.select{...}.force
GC ed 55
56.
Lazy version large_array.lazy.map{...}.select{...}.force
56
57.
Lazy version large_array.lazy.map{...}.select{...}.force
中間データが不要 57
58.
Lazy Chain Demo >>
(0..4).lazy.select{|i| p “select:#{i}”; i.event? }.map{|i| p “map:#{i}”; i * 2 }.force “select:0” “map:0” “select:1” “select:2” “map:2” “select:3” “select:4” “map:4” => [0, 4, 8] 58
59.
Lazy with IO 例)
$stdin から空行を読むまでの各行の 文字数の配列を返す $stdin.lazy.take_while{|l| ! l.chomp.empty? }.map {|l| l.chomp.size } 59
60.
Lazy with IO Enumerable
だと空行まで先に読んでしまう。 Lazy なら1行読むたびに take_while/map の ブロックが実行される → 逐次処理できる 60
61.
Lazy List 無限に続く要素を扱える list =
(0..Float::INFINITY) list.map{|i| i * 2}.take(5) => 返ってこない list.lazy.map{|i| i * 2 }.take(5).force => [0, 2, 4, 6, 8] 61
62.
Pitfall of Lazy? メモ化されない (force
を2回呼ぶともう一度 each が 呼ばれる) IOなど副作用のある each だと結果が 変化するけどいいのかなぁ(いいかも) enum_for のように each のかわりにな るメソッドを指定できない 62
63.
Lazy as a
Better Enumerator Lazy は Enumerator の 正統進化版 63
64.
Happy Lazy Programming!
64
65.
One More Thing! https://github.com/nagachika/lazy_sample
65
Jetzt herunterladen