python - 如何在python中实现 'daisychaining'的可插拔函数?

标签 python

问题是:

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/

相关文章:

python - Vim 表格 : how to ignore long comments

python - 将 Pandas 数据框列转换为数字的更好方法

python - str.split (' ' ) 给我 "ValueError: empty separator"一个字符串形式的句子

python - 等效于 Python pandas 中的 Excel 索引匹配

python - 基于关点的等级系统

Python:多个文件轮流下载

python - 每个 ytick 有多个条形的水平条形图

python - “int”对象不可订阅。 Pandas

python - 在 seaborn barplot 中绘制 value_counts()

python - 如何在 python 中只使用日期时间的时间部分?