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被称为例如 as _, b = f(x),有什么方法可以检测ainside的不相关性f所以a_complex_function(x,c)不需要被调用?果然我可以编写另一个b(x)省略该调用的函数,但是有没有另一种方法可以实现这一点,类似于 MATLAB 的nargout机制?

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

为了提高性能,我建议您查看两个概念:

记忆- 您可以将函数调用的结果保存在字典中,并且在计算后不再重新计算。对于lru_cache的模块中有装饰器functools(对于python 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

懒惰的评价。尝试获取函数结果时,函数的每个结果都会评估一次,然后存储。因此,在您的情况下,直到使用存储函数调用结果的变量才对其进行评估。对于 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 回答