python 3.3的文件处理速度与fortran 77相比

时间:2013-10-04 13:59:05

标签: python io migration fortran legacy

奇怪的问题,我知道。

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

我的建议是完全用python重写(最有可能是3.3)。 fortran代码的维护与您期望的一样困难,并且测试结果与您想象的一样差。显然python在这里会有很多帮助。

在python中的文件处理速度方面是否存在任何性能命中(甚至增益)?目前,该系统的大部分运行时间是读/写文件。

提前致谢

2 个答案:

答案 0 :(得分:3)

Python标准库的IO部分是作为高效的C代码实现的,所以我看到的性能比例如Java,特别是在程序是IO绑定的情况下(与CPU绑定相反)。

回复:

  

目前,该系统的大部分运行时间是读取/写入文件。

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

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

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

另外,请查看PyPy可能在数字运算部分提供(有时是显着的)CPython性能提升而无需您的任何额外工作(不是说您不能或不应该优化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调用它。

答案 1 :(得分:1)

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

Python在IO上不是特别糟糕,提供缓冲的IO和线程功能,并且很容易用C扩展(因此可能没有那么难与Fortran交互)。 Python可能是一种完全合理的技术,可以逐步替换部分代码库 - 事实上,如果你能首先在python中快速生成IO,你可以编译一个最终调用你的Fortran代码的扩展。 / p>