python が遅延言語である場合、それは可能であると思いますが、コードは次のように変更する必要があります
def f(x):
c = common_helper_function(x)
return a_complex_function(x,c), another_complex_function(x,c)
Pythonでは、それは真実ではありません
def test1():
print ' simple function'
return 1
print 'Calling simple function:'
_ = (lambda : test1())()
print 'Calling simple function again:'
_ = (lambda : test1())()
output:
Calling simple function:
simple function # evaluated once
Calling simple function again:
simple function # evaluated twice
パフォーマンスを向上させるために、次の 2 つの概念を確認することをお勧めします。
メモ化- 関数呼び出しの結果を辞書に保持し、一度計算したら再計算しないようにすることができます。メモ化のために、Python 3 のモジュールにlru_cache
デコレータがあります (Python 2.7 の場合はfunctools32をダウンロードできます)。これが例ですfunctools
from functools32 import lru_cache
@lru_cache(maxsize=10)
def test2():
print ' cashed function'
return 1
print 'Calling cashed function:'
_ = (lambda : test2())()
print 'Calling cashed function again:'
_ = (lambda : test2())()
output:
Calling cashed function:
cashed function # evaluated once
Calling cashed function again:
# not evaluated twice
遅延評価。関数の結果を取得しようとすると、関数の各結果が 1 回評価され、格納されます。したがって、あなたの場合、関数呼び出しの結果を格納した変数を使用するまで評価されません。Python 2.7 の場合、Alberto Bertogli による lazy.pyを使用できます。
import lazy
@lazy.lazy
def test3():
print ' lazy function'
return 1
print 'Calling lazy function:'
b = (lambda : test3())()
print 'Calling cashed function again:'
b = (lambda : test3())()
print 'Trying to get results:'
print b
output:
Calling lazy function:
Calling cashed function again:
Trying to get results:
lazy function # evaluated
1