嗯,我想,如果蟒蛇是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
慵懶的聲音是最好的出手,不過應該確保使用的值,以避免難以以後發現的bug儘快評估...:針對Python 2.7,你可以使用lazy.py by Alberto Bertogli –
有許多可能性:) –
事實上,人們甚至可以進一步編寫一個涉及諸如sympy表達式的「超懶」模塊,這些模塊只評估一次真正絕對不可避免的... –