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

ssm49v7z  于 2024-01-05  发布在  Python
关注(0)|答案(4)|浏览(184)

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

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

Makefile示例:

  1. .PHONY : dats
  2. dats : isles.dat abyss.dat
  3. isles.dat : books/isles.txt
  4. python countwords.py books/isles.txt isles.dat
  5. abyss.dat : books/abyss.txt
  6. python countwords.py books/abyss.txt abyss.dat
  7. .PHONY : clean
  8. clean :
  9. 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示例应该是这样的:

  1. rule all:
  2. input:
  3. ['isles.dat', 'abyss.dat'],
  4. rule make_isles:
  5. input:
  6. 'books/isles.txt',
  7. output:
  8. 'isles.dat',
  9. shell:
  10. r"""
  11. python countwords.py {input} {output}
  12. """
  13. rule make_abyss:
  14. input:
  15. 'books/abyss.txt',
  16. output:
  17. 'abyss.dat',
  18. shell:
  19. r"""
  20. python countwords.py {input} {output}
  21. """

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

  1. snakemake # vanilla execution
  2. snakemake -p -n # Print shell commands (-p). Dry-run mode (-n)
  3. snakemake --delete-all-output # Same-ish as .PHONY clean


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

展开查看全部
zaqlnxep

zaqlnxep4#

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

Gird

  • girdfile.py* 的内容:
  1. from gird import Phony, rule
  2. RULE_ISLES = rule(
  3. target=PATH_ISLES_DAT,
  4. deps=PATH_ISLES_TXT,
  5. recipe=f"python countwords.py {PATH_ISLES_TXT} {PATH_ISLES_DAT}",
  6. )
  7. RULE_ABYSS = rule(
  8. target=PATH_ABYSS_DAT,
  9. deps=PATH_ABYSS_TXT,
  10. recipe=f"python countwords.py {PATH_ABYSS_TXT} {PATH_ABYSS_DAT}",
  11. )
  12. rule(
  13. target=Phony("dats"),
  14. deps=(
  15. RULE_ISLES,
  16. RULE_ABYSS,
  17. ),
  18. )
  19. rule(
  20. target=Phony("clean"),
  21. recipe="rm -f *.dat",
  22. )

字符串

doit

  • dodo.py* 的内容:
  1. def task_isles():
  2. return {
  3. "actions": [f"python countwords.py {PATH_ISLES_TXT} {PATH_ISLES_DAT}"],
  4. "file_dep": [PATH_ISLES_TXT],
  5. "targets": [PATH_ISLES_DAT],
  6. }
  7. def task_abyss():
  8. return {
  9. "actions": [f"python countwords.py {PATH_ABYSS_TXT} {PATH_ABYSS_DAT}"],
  10. "file_dep": [PATH_ABYSS_TXT],
  11. "targets": [PATH_ABYSS_DAT],
  12. }
  13. def task_dats():
  14. return {
  15. "task_dep": ["isles", "abyss"],
  16. "actions": None,
  17. }
  18. def task_clean_all():
  19. return {
  20. "actions": ["rm -f *.dat"],
  21. }

展开查看全部

相关问题