问题是:
1) 假设我有一些测量数据(比如从我的电子设备中读取的 1Msample)并且我需要通过处理链来处理它们。
2) 这个处理链由不同的操作组成,可以交换/省略/有不同的参数。一个典型的例子是获取这些数据,首先通过查找表传递它们,然后进行指数拟合,然后乘以一些校准因子
3) 现在,由于我不知道哪种算法最好,我想在每个阶段评估最佳可能的实现(例如,LUT 可以通过 5 种方式生成,我想看看哪一种是最好的)
4) 我想以菊花链方式连接这些函数,以便构建一个包含顶级算法并拥有(即指向)子类的“类”,其中包含较低级别的算法。
我正在考虑使用双链表并生成如下序列:
myCaptureClass.addDataTreatment(pmCalibrationFactor(opt, pmExponentialFit (opt, pmLUT (opt))))
其中 myCaptureClass 是负责数据获取的类,它也应该(在获取数据之后)触发顶级数据处理模块 (pm)。此处理将首先深入到底部子节点 (lut),在那里处理数据,然后是中间 (expofit),然后是顶部 (califactors),并将数据返回到捕获,捕获将数据返回给请求者。
现在这有几个问题:
1) 网上到处都说在 python 中不应该使用双链表 2) 在我看来,这似乎非常低效,因为数据向量很大,因此我更喜欢使用生成器函数的解决方案,但我不确定如何提供“类似插件”的机制。
有人可以提示我如何使用“插件式”和生成器来解决这个问题,这样我就不需要处理 X 兆字节数据的向量并像使用生成器函数时那样“按要求”处理它们吗?
非常感谢
大卫
问题的补充:
看来我没有表达清楚。因此:数据是由插入 VME crate 的外部硬件卡生成的。它们在单个 block 传输中被“提取”到存储在 myCaptureClass 中的 python 元组。
要应用的操作集实际上是在一个流数据上,由这个元组表示。甚至指数拟合也是流操作(它是一组应用于每个样本的可变状态过滤器)。
我错误地显示的参数“opt”是为了表达,每个数据处理类都有一些配置数据,并修改用于操作数据的方法的行为。
目标是在 myCaptureClass 中引入一个菊花链式类(而不是函数),当用户请求数据时,我们过去常常将“原始”数据处理成最终形式。
为了“节省”内存资源,我认为使用生成器函数提供数据可能是个好主意。
从这个角度来看,bukzor 的代码似乎与我想要做的最接近。我宁愿有一个类实现而不是函数,但我想这只是在特定类中实现 call 运算符的装饰性东西,它实现了数据操作....
最佳答案
这就是我想象的你会这样做的方式。我希望这是不完整的,因为我不完全理解你的问题陈述。请让我知道我做错了什么:)
class ProcessingPipeline(object):
def __init__(self, *functions, **kwargs):
self.functions = functions
self.data = kwargs.get('data')
def __call__(self, data):
return ProcessingPipeline(*self.functions, data=data)
def __iter__(self):
data = self.data
for func in self.functions:
data = func(data)
return data
# a few (very simple) operators, of different kinds
class Multiplier(object):
def __init__(self, by):
self.by = by
def __call__(self, data):
for x in data:
yield x * self.by
def add(data, y):
for x in data:
yield x + y
from functools import partial
by2 = Multiplier(by=2)
sub1 = partial(add, y=-1)
square = lambda data: ( x*x for x in data )
pp = ProcessingPipeline(square, sub1, by2)
print list(pp(range(10)))
print list(pp(range(-3, 4)))
输出:
$ 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 - 如何在python中实现 'daisychaining'的可插拔函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10249121/