使用Python

时间:2017-07-23 17:55:30

标签: python python-2.7 python-3.x lambda partial

我目前有以下结构:

在类中,我需要使用两个特殊变量和任意数量的参数来处理几种类型的函数。要将这些方法包装在我应用的方法中,我首先扫描函数签名(非常可靠)并确定参数和变量是什么。

然后我用以下方式用lambda表达式将它们绑定回来。让func(x, *args)成为我的函数,然后我将绑定

f = lambda x, t: func(x=x, **func_parameter)

如果我得到func(x, t, *args)我绑定

f = lambda x, t: func(x=x, t=t, **func_parameter)

和类似的,如果我没有变量。 我必须将f(x,t)形式的函数传递给该类中的方法。

我想使用functools.partial - 它是更加pythonic的方式,并且执行时的性能更好(函数f可能被称为几百万次......) 。我遇到的问题是,如果我有一个独立于变量tx之一的基函数,我不知道该怎么办,这就是我使用lambda函数的原因,他们只是映射另一个变量'blind'。它仍然是两个函数调用,而lambda和partial的定义需要相同的时间,部分执行速度要快得多。

在这种情况下,是否有人知道如何使用偏?性能在这里是一个问题。

编辑:过了一会儿。我发现使用元组参数的函数求值比使用关键字参数更快,所以这是一个加号。 然后,最后,作为一个用户,我只想从Python中进行一些猜测工作,即直接定义 def func(x): return 2*x 代替 def func(x, a): return a*x 并直接调用它。这样我就可以直接使用这个功能了。第二种情况是,如果我实现xt都作为部分映射存在的情况。 这可能是妥协。

1 个答案:

答案 0 :(得分:1)

您可以编写具有f(x,t)呼叫签名的适配器类。结果类似于functools.partial但更灵活。 __call__为您提供一致的呼叫签名,并允许您添加,删除和映射参数。在创建实例时可以修复参数。它似乎应该像普通函数一样快地执行,但我没有基础。

玩具版:

class Adapt:
    '''return a function with call signature f(x,t)'''
    def __init__(self, func, **kwargs):
        self.func = func
        self.kwargs = kwargs
    def __call__(self, x, t):
        # mapping magic goes here
        return self.func(x, t, **self.kwargs) 
        #return self.func(a=x, b=t, **self.kwargs)

def f(a, b, c):
    print(a, b, c)

用法:

>>> f_xt = Adapt(f, c = 4)
>>> f_xt(3, 4)
3 4 4
>>> 

不知道如何为任意参数和映射制作通用名称,也许某人会想出一个想法或编辑。

因此,如果您最终编写特定于每个函数的适配器,则该函数可以在类中嵌入而不是实例参数。

class AdaptF:
    '''return a function with call signature f(x,t)'''
    def __init__(self, **kwargs):
        self.kwargs = kwargs
    def __call__(self, x, t):
        '''does stuff with x and t'''
        # mapping magic goes here
        return self.func(a=x, b=t, **self.kwargs)
    def func(self, a, b, c):
        print(a, b, c)

>>> f_xt = AdaptF(c = 4)
>>> f_xt(x = 3, t = 4)
3 4 4
>>> 

我只是从我读过的东西中得到了这个,所以我不知道它是否可行。我觉得我应该赞扬我读到的来源,但对于我的生活,我无法找到它 - 我可能在pyvideo上看到它。