处理makefile对python数据分析的作用的最先进的方法是什么?

ssm49v7z  于 12个月前  发布在  Python
关注(0)|答案(4)|浏览(143)

我有一个DAG程序,它可以处理和清理某些文件,组合它们,然后进行额外的计算。我希望有一种方法可以运行整个分析管道,如果有任何变化,可以重新运行,但不必重新处理每个组件。
我读过Makefiles,认为它听起来像是完美的解决方案。我也意识到它可能已经过时了,可能存在更好的替代品,但我通常只找到大量的工作流调度工具,不太适合这个目的,据我所知(例如,Airflow,Luigi,Nextflow,Dagobah等)。
看起来这些文件中的许多都是多余的,我并不真正需要的插件,GUI等。我只想要一个文件,它可以执行以下操作:

  • 使所有需要运行的python脚本变得显而易见
  • 显示文件依赖关系,以便完全重新运行将只重做上游已更改的部分
  • 有可能进行一些并行化(不是非常必要)
  • 没有太多的样板文件

Makefile示例:

.PHONY : dats
dats : isles.dat abyss.dat

isles.dat : books/isles.txt
    python countwords.py books/isles.txt isles.dat

abyss.dat : books/abyss.txt
    python countwords.py books/abyss.txt abyss.dat

.PHONY : clean
clean :
    rm -f *.dat

字符串
这是在python中运行类似程序的最佳过程吗?或者有更好的方法吗?

bttbmeg0

bttbmeg01#

DVC(数据版本控制)包括make的现代重新实现和扩展,特别适合数据科学管道(参见here)。
在许多情况下,在DVC中处理管道比make有重要的好处,例如依赖于文件校验和而不是修改时间。相反,make在某种意义上更简单,并且具有强大的宏机制。尽管如此,makefiles的语法中仍有一些元素非常微妙(例如,多个输出,中间文件),并且make通常不支持文件名中的空格。

kdfy810k

kdfy810k2#

这是在python中运行类似程序的最佳过程吗?或者有更好的方法吗?
“最好”当然是在旁观者的眼中。然而,如果问题中提出的基于make的方法令人满意地代表了问题,那么它就是一个好方法。make实现非常广泛,它们的行为被很好地理解,并且通常非常适合于所提出的问题。
还有其他一些构建工具可以与make竞争,其中一些是用Python编写的,毫无疑问,还有一些更深奥的软件框架可以应用于该任务。然而,如果您想专注于完成工作,而不是构建框架来完成工作,那么我认为没有任何理由忽略您已经拥有的基于make的解决方案。

p4rjhz4m

p4rjhz4m3#

你提出这个问题的方式,我会说snakemake是要走的路。话虽如此,GNU make可能是老的,但不会很快消失,它已经被测试和尝试死亡。
我不会说make,但我认为你的snakemake中的Makefile示例应该是这样的:

rule all:
    input:
        ['isles.dat', 'abyss.dat'],

rule make_isles:
    input:
        'books/isles.txt',
    output:
        'isles.dat',
    shell:
        r"""
        python countwords.py {input} {output}
        """

rule make_abyss:
    input:
        'books/abyss.txt',
    output:
        'abyss.dat',
    shell:
        r"""
        python countwords.py {input} {output}
        """

字符串
将其保存到名为Snakefile的文件中,并执行它:

snakemake # vanilla execution   

snakemake -p -n # Print shell commands (-p). Dry-run mode (-n)

snakemake --delete-all-output # Same-ish as .PHONY clean


snakemake在生物信息学中很受欢迎,但它具有相当普遍的用途。

zaqlnxep

zaqlnxep4#

也许不是“最先进的”,但这里有两个相对轻量级的替代Python工具,符合OP的要求。
在这两种情况下,规则/任务配置都是在Python中完成的,这可能比Make专用的规则定义语法更受欢迎,并且在使用Python代码时增加了灵活性。另一方面,在简洁性方面很难击败Make的语法。
通过命令行对python进行编译以及下面示例的其他细节可能不适合这些工具,但实现应该接近OP的Makefile示例。

Gird

  • girdfile.py* 的内容:
from gird import Phony, rule

RULE_ISLES = rule(
    target=PATH_ISLES_DAT,
    deps=PATH_ISLES_TXT,
    recipe=f"python countwords.py {PATH_ISLES_TXT} {PATH_ISLES_DAT}",
)

RULE_ABYSS = rule(
    target=PATH_ABYSS_DAT,
    deps=PATH_ABYSS_TXT,
    recipe=f"python countwords.py {PATH_ABYSS_TXT} {PATH_ABYSS_DAT}",
)

rule(
    target=Phony("dats"),
    deps=(
        RULE_ISLES,
        RULE_ABYSS,
    ),
)

rule(
    target=Phony("clean"),
    recipe="rm -f *.dat",
)

字符串

doit

  • dodo.py* 的内容:
def task_isles():
    return {
        "actions": [f"python countwords.py {PATH_ISLES_TXT} {PATH_ISLES_DAT}"],
        "file_dep": [PATH_ISLES_TXT],
        "targets": [PATH_ISLES_DAT],
    }

def task_abyss():
    return {
        "actions": [f"python countwords.py {PATH_ABYSS_TXT} {PATH_ABYSS_DAT}"],
        "file_dep": [PATH_ABYSS_TXT],
        "targets": [PATH_ABYSS_DAT],
    }

def task_dats():
    return {
        "task_dep": ["isles", "abyss"],
        "actions": None,
    }

def task_clean_all():
    return {
        "actions": ["rm -f *.dat"],
    }

相关问题