【せんこうひょうか】

先行評価 とは?

最終更新:
💡 「聞いた瞬間に答えを出す」即断即決タイプの評価戦略。

必要になるまで計算を保留せず、先に値を求める評価戦略。たとえば通常の関数呼び出しで、引数の式を評価してから関数本体を実行する。遅延評価と対比される。

📌 このページのポイント
先に計算するか、必要時に計算するか 先行評価の例 遅延する例 x = double(3) g = (double(n) for n in [3]) 3 × 2 x = 6 代入前に値を求める まだ要素は計算しない next(g) を呼ぶ 3 × 2 6を返す Pythonの例:double(n) は n × 2 を返す 同じ言語でも構文や仕組みによって違う
左は通常の代入、右はジェネレーター式。先行評価かどうかと、複数の式を評価する順序は別の性質。
ひよこ ひよこ
プログラムって、式をいつ計算するか違うの?
ペンギン先生 ペンギン先生
違うよ。たとえば関数の引数を先に計算してから本体を実行する方法と、値が必要になるまで計算を保留する方法がある。前者は先行評価、後者は遅延評価の考え方だね。
ひよこ ひよこ
先行評価はどんなタイミングで計算するの?
ペンギン先生 ペンギン先生
Pythonでx = 1 + 2を実行するなら、右辺の値を求めてからxへ代入するよ。関数へheavyCalc()の結果を渡すなら、その呼び出しを済ませてから本体へ進む。コードを書いたり、実行しない分岐に式を置いたりしただけで計算されるわけではないんだ。
ひよこ ひよこ
PythonやJavaなら、何でもすぐ計算する?
ペンギン先生 ペンギン先生
通常の関数やメソッドの呼び出しでは引数を先に評価するよ。でもPythonのandは、左側が偽なら右側を評価しない。ジェネレーターでは、要素を取り出すときに計算する部分もある。同じ言語でも構文や使う仕組みによって違うんだ。
ひよこ ひよこ
先行評価なら副作用の順序も決まるの?
ペンギン先生 ペンギン先生
いつ値を求めるかと、引数を左右どちらから評価するかは別の話だよ。PythonやJavaには左から右という規則があるけれど、それは各言語の仕様。先行評価という名前だけで、すべての言語の実行順序やデバッグのしやすさが決まるわけではないね。
ひよこ ひよこ
デメリットもあるの?
ペンギン先生 ペンギン先生
関数本体で使わない引数でも、先に計算するなら時間や副作用が発生するよ。大量の要素を先に全部作る場合も、使わない分まで計算・保存することがある。必要な分を順に作る方法も使えるので、処理の目的に合わせて選ぶんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「先行評価」って出てきたら「必要になるまで待たず、先に値を求める方法」と思えればだいたいOK!
📖 おまけ:英語の意味
「Eager Evaluation」 = 先行評価・即時評価
💬 eagerは熱心な、待ちきれないという意味の英単語。必要になるまで計算を保留せず、先に値を求めるイメージだよ。ソースコードを書いた瞬間に実行するという意味ではないんだ

参考資料

← 用語集にもどる