管道内缺陷分割python_python - python中的功能管道,例如R的magritrr中的%>% - 堆栈内存溢出...

一种替代解决方案是使用工作流工具dask。 虽然在语法上不如...

var

| do this

| then do that

...它仍然允许您的变量沿链向下流动,并且在可能的情况下使用dask可以带来并行化的更多好处。

这是我使用dask来完成管道链模式的方法:

import dask

def a(foo):

return foo + 1

def b(foo):

return foo / 2

def c(foo,bar):

return foo + bar

# pattern = 'name_of_behavior': (method_to_call, variables_to_pass_in, variables_can_be_task_names)

workflow = {'a_task':(a,1),

'b_task':(b,'a_task',),

'c_task':(c,99,'b_task'),}

#dask.visualize(workflow) #visualization available.

dask.get(workflow,'c_task')

# returns 100

在使用elixir之后,我想在Python中使用管道模式。 这不是完全相同的模式,但是类似,就像我说的那样,还带来了并行化的更多好处。 如果您告诉dask在工作流程中获得一个不依赖其他人先运行的任务,则它们将并行运行。

如果您想要更简单的语法,则可以将其包装在可以为您命名任务的内容中。 当然,在这种情况下,您将需要所有函数将管道作为第一个参数,并且您将失去任何并行化的好处。 但是,如果您认为可以,可以执行以下操作:

def dask_pipe(initial_var, functions_args):

'''

call the dask_pipe with an init_var, and a list of functions

workflow, last_task = dask_pipe(initial_var, {function_1:[], function_2:[arg1, arg2]})

workflow, last_task = dask_pipe(initial_var, [function_1, function_2])

dask.get(workflow, last_task)

'''

workflow = {}

if isinstance(functions_args, list):

for ix, function in enumerate(functions_args):

if ix == 0:

workflow['task_' + str(ix)] = (function, initial_var)

else:

workflow['task_' + str(ix)] = (function, 'task_' + str(ix - 1))

return workflow, 'task_' + str(ix)

elif isinstance(functions_args, dict):

for ix, (function, args) in enumerate(functions_args.items()):

if ix == 0:

workflow['task_' + str(ix)] = (function, initial_var)

else:

workflow['task_' + str(ix)] = (function, 'task_' + str(ix - 1), *args )

return workflow, 'task_' + str(ix)

# piped functions

def foo(df):

return df[['a','b']]

def bar(df, s1, s2):

return df.columns.tolist() + [s1, s2]

def baz(df):

return df.columns.tolist()

# setup

import dask

import pandas as pd

df = pd.DataFrame({'a':[1,2,3],'b':[1,2,3],'c':[1,2,3]})

现在,使用此包装器,您可以按照以下两种语法模式制作管道:

# wf, lt = dask_pipe(initial_var, [function_1, function_2])

# wf, lt = dask_pipe(initial_var, {function_1:[], function_2:[arg1, arg2]})

像这样:

# test 1 - lists for functions only:

workflow, last_task = dask_pipe(df, [foo, baz])

print(dask.get(workflow, last_task)) # returns ['a','b']

# test 2 - dictionary for args:

workflow, last_task = dask_pipe(df, {foo:[], bar:['string1', 'string2']})

print(dask.get(workflow, last_task)) # returns ['a','b','string1','string2']

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值