【问题标题】:File handling speed of python 3.3 compared to fortran 77python 3.3 与 fortran 77 相比的文件处理速度
【发布时间】:2013-10-08 00:30:35
【问题描述】:

这个奇怪的问题,我知道。

我在 fortran 77 中有一个代码库,它在大多数情况下解析大型非二进制文件,对这些文件进行一些操作,然后进行大量文件写入。代码库不进行任何矩阵操作或数字运算。这个遗留代码是在 fortran 中,因为许多其他代码库确实需要严格的数字处理。这本来只是用fortran写的,因为有fortran的知识。

我的建议是完全用 python 重写它(很可能是 3.3)。 fortran 代码的维护和你想象的一样困难,而且测试也和你想象的一样糟糕。显然 python 在这里会有很大帮助。

在 python 中的文件处理速度方面是否有任何性能影响(甚至提升)?目前该系统的大部分运行时间都在读取/写入文件。

提前致谢

【问题讨论】:

  • 对于 I/O 密集型任务,您可能会发现差别不大。不幸的是,任何关于实际性能的猜测都只是猜测。没有先验理由相信 f77 中的文本处理比 Python 更好或更差。
  • 很大程度上取决于 I/O 类型,格式化与非格式化。你的情况是哪一个?也就是说,我认为原始 Python I/O 很容易达到峰值,除非是并行文件系统等等。
  • 几个月前有一个类似的question。 fortran 最大的问题是,一方面,每个 IO 操作都可能被锁定操作等包围,另一方面,取决于编译器,默认情况下可能不会缓冲输出。归根结底,我不会期望性能收益...
  • 非常有帮助的 cmets,谢谢。我会做一些适当的基准测试并为此获得一些数字。很高兴知道没有其他人认为性能会下降

标签: python io migration fortran legacy


【解决方案1】:

Python 标准库的 IO 部分是作为高效的 C 代码实现的,所以我看到性能比在例如Java,尤其是在程序受 IO 限制(而不是 CPU 限制)的情况下。

回复:

目前该系统的大部分运行时间都在读/写文件。

此外,如果您的逻辑将文件作为流而不是整个文件的内容进行处理,那么如果您使用正确的工具来完成这项工作,那么在迁移到 Python 时,您实际上可能会看到性能提升。基本上,这个想法是以块的形式读取输入,处理块并将结果立即写入输出文件。这可以最大限度地减少内存使用和延迟,尤其是当您的管道包含多个步骤时。 Python 生成器允许以非常干净、易读和简洁的方式编写这样的逻辑,这是你在 Fortran 或 C 中找不到的东西,至少不需要付出一些额外的努力来构建这样的抽象(即使那样你最终也会得到非常神奇和/或神秘的代码)。

请参阅 http://www.dabeaz.com/generators/ 了解有关使用生成器在 Python 中处理文件的非常好的文本。

此外,根据处理算法的性质和复杂性,您可能会发现 Python 中可用的其他抽象(例如 coroutines)或库(geventnumpy 等)将帮助您实现更好的整体性能,因为它更容易理解和重构代码。 (这当然适用于任何高级语言与低级语言的比较。)

另外,请查看PyPy:它可能在数字处理部分提供(有时是显着的)性能提升,而不需要您付出任何额外的努力(并不是说您可以'不应该或不应该为 PyPy JIT 编译器优化你的代码:))。

然后是Cython,它允许您编写普通的 Python,将其与将直接转换为 C 代码的部分混合。这具有比 Fortran(和 C)更好的可维护性和可读性以及 C 的性能的优势,同时使您能够使用大多数(如果不是全部)高级 Python 构造,以及直接调用纯 Python 代码以及纯C 代码/库(可能还有 Fortran 代码/库:http://www.sfu.ca/~mawerder/notes/calling_fortran_from_python.html)。您也可以在 Cython 中编写代码的性能关键(CPU 限制)部分,然后直接从 Python 调用它。

【讨论】:

    【解决方案2】:

    一般来说,除非您的特定编译器和可用工具集特别适得其反,否则一种编程语言能够与另一种语言一样快地执行 IO。在许多编程语言中,一种简单的方法可能不是最优的——就像编程的所有与性能相关的方面一样,这是通过适当的设计和适当使用可用工具(例如并行处理、使用缓冲、例如,线程 IO)。

    Python 在 IO 方面特别糟糕,提供缓冲 IO 和线程功能,并且易于使用 C 扩展(因此与 Fortran 交互可能并不难)。 Python 可能是一种完全合理的技术,可以增量替换您的部分代码库 - 事实上,如果您可以首先在 Python 中使 IO 更快,您可能可以编译一个最终调用您的 Fortran 代码的扩展。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 2015-04-04
      • 1970-01-01
      • 2018-07-01
      • 2012-08-05
      • 1970-01-01
      • 2013-11-10
      相关资源
      最近更新 更多