2013-08-02 45 views
1

給定函數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被稱爲例如作爲_, b = f(x),有沒有什麼辦法來檢測a裏面f的不相關性,所以a_complex_function(x,c)不需要被調用?果然,我可以編寫另一個函數b(x),它省略了那個調用,但是有另一種方法可以實現這一點,類似於例如。 MATLAB的nargout機制?

回答

1

嗯,我想,如果蟒蛇是lazy language,它可能是可能的,但你的代碼應該改變像

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 

爲了提高性能,我可以建議你看到兩個概念:

Memoization - 你可以保留你的函數調用結果在字典中,不要重新計算一次c降低了它。 爲了便於記憶,lru_cache裝飾者在functools模塊的python 3(forpython 2.7,你可以下載functools32)。 下面是一個例子

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 

Lazy evaluation。當試圖獲取函數的結果然後存儲時,函數的每個結果都會被計算一次。所以在你的情況下,直到使用存儲函數調用結果的變量纔會對其進行評估。在此

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 
+0

慵懶的聲音是最好的出手,不過應該確保使用的值,以避免難以以後發現的bug儘快評估...:針對Python 2.7,你可以使用lazy.py by Alberto Bertogli

+0

有許多可能性:) –

+0

事實上,人們甚至可以進一步編寫一個涉及諸如sympy表達式的「超懶」模塊,這些模塊只評估一次真正絕對不可避免的... –

相關問題