1

function が与えられた場合a, b = f(x)、どの戻り引数が実際に使用されているかを判断する (pythonic) 方法はありますか? 疑似例として、

def f(x):
    c = common_helper_function(x)
    a = a_complex_function(x,c)
    b = another_complex_function(x,c)
    return a, b

各関数呼び出しには時間がかかります。fがたとえば as と呼ばれる場合、呼び出す必要のない内部_, b = f(x)の無関係性を検出する方法はありますか? 案の定、その呼び出しを省略する別の関数を書くこともできますが、これを達成する別の方法はありますか?たとえば、MATLAB のnargoutメカニズムに似ていますか?afa_complex_function(x,c)b(x)

4

1 に答える 1

1

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
于 2013-08-02T10:05:19.917 に答える