Python 3.3与Fortran 77的文件处理速度比较

9

这个问题有点奇怪,我知道。

我有一个Fortran 77的代码库,大部分用于解析大型非二进制文件,对这些文件进行一些操作,然后进行大量文件写入。该代码库不进行任何矩阵操作或数值计算。这个遗留代码使用Fortran是因为许多其他代码库确实需要严格的数值计算。最初只是使用Fortran编写这个代码是因为有Fortran的知识。

我的建议是完全使用Python(很可能是3.3)重新编写它。维护Fortran代码与您所期望的一样困难,测试也像您想象的那样差。显然,Python在这里会帮助很多。

在Python中,文件处理速度方面是否存在性能损失(甚至提高)?目前,该系统的大部分运行时间都用于读取/写入文件。

提前致谢


4
对于I/O绑定任务,你可能看不出太大的差异。不幸的是,关于实际性能的任何猜测都只是猜测。没有先验理由认为f77中的文本处理比Python更好或更差。 - msw
严重依赖于I/O类型,格式化与非格式化。你的情况是哪种?话虽如此,我认为原始的Python I/O很容易达到峰值,除了并行文件系统等。 - Anycorn
1
几个月前有一个类似的问题。Fortran 的最大问题在于一方面每个 IO 操作可能会被锁定等操作包围,另一方面,取决于编译器,默认情况下输出可能没有缓冲。归根结底,我不认为会有性能上的好处... - Stefan
非常有用的评论,谢谢。我将进行一些适当的基准测试并获得一些数据。很高兴知道没有人认为性能会降低。 - Fraser
2个回答

3
Python标准库的IO部分是用高效的C代码实现的,因此在程序受到I/O限制(而非CPU限制)的情况下,我看到的性能比例如Java等语言要好。此外,如果您的逻辑将文件作为流处理,而不是整个文件的内容,那么如果使用正确的工具,迁移到Python可能会看到性能提升。基本上,想法是按块读取输入,处理块并立即将结果写入输出文件。这最小化了内存使用和延迟,特别是如果您的管道由多个步骤组成。Python生成器允许以非常干净、易读和简洁的方式编写这样的逻辑,这是您在Fortran或C中找不到的东西,至少没有额外的大量努力来构建这样的抽象(即使这样,您最终也会得到非常神奇和/或晦涩的代码)。请参阅http://www.dabeaz.com/generators/以获取有关使用生成器在Python中处理文件的真正好文章。
此外,根据您的处理算法的性质和复杂程度,您可能会发现其他抽象(例如协程)或Python中可用的库(geventnumpy等)将有助于实现更好的整体性能,因为它更容易理解和重构代码。(当然,在任何高级语言与低级语言之间的比较中都是如此。)
另外,请查看PyPy:它可能在无需任何额外努力的情况下为Cython中的计算部分提供(有时显着的)性能提升(这并不是说您不能或不应该优化代码以适应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
一般来说,除非您特定的编译器和可用工具集做了特别反生产力的事情,否则一种编程语言能够像另一种编程语言一样快地进行IO。在许多编程语言中,天真的方法可能是次优的——像编程的所有与性能相关的方面一样,这是通过适当的设计和适当使用可用的工具(如并行处理、使用缓冲、线程化IO等)来解决的。
Python在IO方面并不是特别差,提供缓冲IO和线程功能,并且很容易通过C进行扩展(因此可能不难与Fortran交互)。Python很可能是逐步替换代码库部分的完全合理技术——实际上,如果您可以首先在Python中快速进行IO,那么您可能会编译一个最终调用Fortran代码的扩展。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接