如何实施';daisychaining';python中可插入函数的定义?

如何实施';daisychaining';python中可插入函数的定义?,python,Python,问题是: 1) 假设我有一些测量数据(比如从我的电子设备中读取的1Msample),我需要通过一个处理链来处理它们 2) 此处理链由不同的操作组成,这些操作可以交换/省略/具有不同的参数。一个典型的例子是获取这些数据,首先通过查找表传递它们,然后进行指数拟合,然后乘以一些校准因子 3) 现在,由于我不知道哪种算法最好,我想在每个阶段评估可能的最佳实现(例如,LUT可以通过5种方式生成,我想看看哪种是最好的) 4) 我想将这些函数串联起来,这样我就可以构造一个包含顶级算法的“类”,并拥有(即指向)

问题是:

1) 假设我有一些测量数据(比如从我的电子设备中读取的1Msample),我需要通过一个处理链来处理它们

2) 此处理链由不同的操作组成,这些操作可以交换/省略/具有不同的参数。一个典型的例子是获取这些数据,首先通过查找表传递它们,然后进行指数拟合,然后乘以一些校准因子

3) 现在,由于我不知道哪种算法最好,我想在每个阶段评估可能的最佳实现(例如,LUT可以通过5种方式生成,我想看看哪种是最好的)

4) 我想将这些函数串联起来,这样我就可以构造一个包含顶级算法的“类”,并拥有(即指向)包含低级算法的子类

我在考虑使用双链表并生成如下序列:

添加数据处理(pmCalibrationFactor(opt,pmExponentialFit(opt,pmLUT(opt)))

其中myCaptureClass是负责数据采集的类,它也应该(在采集数据之后)触发顶级数据处理模块(pm)。这种处理将首先深入底层子级(lut),在那里处理数据,然后在中间(expofit),然后在顶部(califactors),并将数据返回到捕获,捕获将把数据返回给请求者

现在有几个问题:

1) 网络上到处都有人说在python中不应该使用双链接列表 2) 在我看来,这似乎效率很低,因为数据向量很大,因此我更喜欢使用生成器函数的解决方案,但我不确定如何提供“插件式”机制

有人能给我一个提示,如何使用“插件风格”和生成器解决这个问题,这样我就不需要处理X兆字节的数据向量,并且在使用生成器功能时“根据请求”处理它们了

非常感谢

大卫

问题的增编:

我似乎没有准确地表达自己。因此:数据由插入VME板条箱的外部硬件卡生成。它们通过一个块传输“获取”到python元组,该元组存储在myCaptureClass中

要应用的操作集实际上是流数据,由这个元组表示。甚至指数拟合也是流操作(它是应用于每个样本的一组可变状态过滤器)

我错误地显示的参数'opt'表示,这些数据处理类中的每一个都有一些随附的配置数据,并修改用于操作数据的方法的行为

我们的目标是在myCaptureClass中引入一个daisychained类(而不是函数),当用户请求数据时,我们使用该类将“原始”数据处理为最终形式

为了“节省”内存资源,我认为使用生成器函数来提供数据可能是个好主意


从这个角度来看,似乎最接近我想要做的事情显示在bukzor的代码中。我更喜欢使用类实现而不是函数,但我想这只是在特定类中实现调用运算符的一种装饰,它实现了数据操作….

从pypi获取
函数
模块。它有一个组合函数来组合两个可调用项。这样,就可以将函数链接在一起

该模块和
functool
都为部分应用提供了
partial
功能


您可以在生成器表达式中像其他表达式一样使用组合函数。

不知道您想要什么,我想我应该指出,您可以在列表中放入任何您想要的内容:

l = [myCaptureClass.addDataTreatment(
          pmCalibrationFactor(opt, pmExponentialFit (opt, pmLUT (opt))))
     for opt in data]
将创建通过组合函数传递的新数据列表

或者您可以创建一个用于循环的生成器表达式,这不会构造一个完整的新列表,它只会创建一个迭代器。我不认为这样做与只处理循环体中的数据相比有任何好处,但这很有趣:

d = (myCaptureClass.addDataTreatment(
          pmCalibrationFactor(opt, pmExponentialFit (opt, pmLUT (opt))))
     for opt in data)
for thing in d:
    # do something
    pass

或者
opt
是数据吗?

我想你会这么做的。我想这是不完整的,因为我不完全理解你的问题陈述。请让我知道我做错了什么:)

输出:

$ python how-to-implement-daisychaining-of-pluggable-function-in-python.py 
[-2, 0, 6, 16, 30, 48, 70, 96, 126, 160]
[16, 6, 0, -2, 0, 6, 16]

如果你能给我们一个简单的输入输出例子,我们可以给出具体的答案。你应该使用一个Python列表,你想要在C++中使用一个双链表。注意这是一个列表理解,而不是生成器,但是语法几乎是一样的。我不知道你的意思。您的代码已经生成了一个列表。将其传递给列表构造函数将给出第二个(值相同)列表。对,抱歉,我刚才说,将表达式放入列表构造函数函数将使其成为生成器表达式,将其放入列表文本将使其成为列表理解。对,但也可以将其放入括号中,结果是一个生成器对象。如果括号中的是parens,那么是的,实际上这会更有效,当然是在内存方面。我试着用2修改函数以使用类。我已经创建了一个类,它使用参数数据重写了
\uuuuuu调用
函数。
y=2
已传递给构造函数<代码>\uuuu调用使用
yield
作为mul函数。我认为您应该:创建一个分部函数,构造数据空处理管道,然后调用该管道并返回相同的类,但将数据附加到该管道。最后一个
list(pp(..)
命令调用调用每个函数的
\uuuuuuuuuuuuuuuuuuuuu
。如果函数是一个类,它应该调用它的
\uuuu调用\uuuu
。但有点不对劲,因为它出人意料地期望我的课是可接受的。“怎么了?”大卫贝拉德:请你
$ python how-to-implement-daisychaining-of-pluggable-function-in-python.py 
[-2, 0, 6, 16, 30, 48, 70, 96, 126, 160]
[16, 6, 0, -2, 0, 6, 16]