Python:将参数传递给函数

时间:2018-06-13 10:36:56

标签: python dlib

我正在使用dlib' find_min_global函数,这是一种优化算法,可帮助查找最小化函数输出的值。例如

import dlib
def holder_table(x0,x1):
    return -abs(sin(x0)*cos(x1)*exp(abs(1-sqrt(x0*x0+x1*x1)/pi)))

x,y = dlib.find_min_global(holder_table, 
                           [-10,-10],  # Lower bound constraints on x0 and x1 respectively
                           [10,10],    # Upper bound constraints on x0 and x1 respectively
                           80)         # The number of times find_min_global() will call holder_table()

此处holder_table函数返回需要针对x0x1的不同值最小化的值。

此处holder_table功能仅接受需要优化的值x0x1。但是我想要使用dlib函数的函数需要的时间超过x0x1。定义的功能看起来像这样

def holder_table(a,b,x0,x1):
    return -abs(sin(b*x0/a)*cos(x1)*exp(abs(1-sqrt(x0*x0+x1*x1)/pi)))

a, b不固定,是另一个函数的输出。现在,我可以在a, b内直接调用函数返回holder_table,但我不想最终重新计算它们,因为每次调用holder_table a, b都会重新计算 - 计算并且该过程耗时。

如何将a, b传递给holder_table函数?

2 个答案:

答案 0 :(得分:1)

您的问题并非100%明确,但看起来您需要partial application。在Python中,这可以使用专用的functools.partial对象完成,或者使用closure(使用内部函数或lambda)完成

def holder_table(a,b,x0,x1):
    return -abs(sin(b*x0/a)*cos(x1)*exp(abs(1-sqrt(x0*x0+x1*x1)/pi)))


def main():
    a, b = some_heavy_function(...)
    holder_table_partial = lambda ax, ay: holder_table(a, b, ax, ay)
    x, y = dlib.find_min_global(
        holder_table_partial, [-10,-10], [10,10], 80
        )    

答案 1 :(得分:1)

仅根据您对规范的介绍,holder_table是一个函数,它接受两个参数并返回可用于帮助指导优化步骤的最终结果。此外,如果我理解正确,ab是目标公式的组成部分,但可能需要一段时间才能计算,并且您不希望更频繁地调用其逻辑的计算 - 所以包括他们在中的推导 holder_table似乎效率低下。

如下:

def build_objective_function(a,b):
    def holder_table(x0,x1):
        return -abs(sin(b*x0/a)*cos(x1)*exp(abs(1-sqrt(x0*x0+x1*x1)/pi)))
    return holder_table

你会这样称呼:

a = <compute a>
b = <compute b>
holder_table = build_objective_function(a,b)  # holder_table will be a function

x,y = dlib.find_min_global(holder_table, 
                           [-10,-10],  # Lower bound constraints on x0 and x1 respectively
                           [10,10],    # Upper bound constraints on x0 and x1 respectively
                           80)         # The number of times find_min_global() will call holder_table()