このすみ技術ろぐ

とあるWebエンジニアが、技術や趣味について書くブログです。

プログラミング言語における遅延評価について

最新号(Vol.125)のWEB+DB PRESSを読んでいるのですが、プログラミング言語を知ろうの一節で、遅延評価という仕組みが出てきました。 Haskellについて紹介する一節ですが、遅延評価をあまり理解していなかったので、調べた内容を共有します。

遅延評価とは

遅延評価というのは、文字通り遅れて評価する仕組みのことです。 Xoxzoブログさんの記事が簡潔で良かったので、例として挙げたいと思います。

for i in range(0,10**8):
    if i == 0:
        break

Xoxzoブログさんの記事では、上記のサンプルがPython2.7で4秒、Python3.6だと100万分の5秒で終わったと書かれています。 これは range(0,10**8) の挙動の違いによるもので、10の8乗の長さの配列を、いつ生成するのかという違いによるものです。

Python2.7では、先行評価によって10の8乗の長さの配列が作られるため遅いのです。 一方Python3.6では、必要に迫られた段階(つまり遅延評価)で作業を行なうため、ムダがありません。

range()関数の細かい仕様までは把握してないのですが、動き的にはyieldをイメージすると近そうです。

blog.xoxzo.com

SwiftのLazyプロパティー

そういえば、私がはじめて遅延という仕組みを知ったのは、SwiftのLazyプロパティーでした。 数年前の話なのでうろ覚えですが、クラス変数に lazy を付けました。

動機としては、初期化処理が遅くなるため必要となった段階で実行したかったからです。

qiita.com

遅延評価のメリットとデメリット

いろいろと調べた限り、遅延評価はメモリの有効活用だったり、真に必要となるタイミングまで実行しないことでパフォーマンスの最適化が期待できます。

その一方で処理を先延ばしすることによって、性能を見積もることが難しくなるといったデメリットが存在します。

まとめ

遅延評価のメリットは理解できたのですが、使いこなせるのかと問われると、まだ自信はありません。

そもそも遅延評価出来そうな仕組みが備わっているのかという側面もあるので、まずは各々が現在使っているプログラミング言語について、遅延評価の仕組みがあるのか調べてみてはいかがでしょうか?