奇怪的问题,我知道。
我在fortran 77中有一个代码库,它在大多数情况下解析大型非二进制文件,对这些文件进行一些操作然后执行大量文件编写。代码库不进行任何矩阵操作或数字运算。这个遗留代码是fortran,因为许多其他代码库确实需要严重的数字运算。这最初只是用fortran写的,因为有了fortran的知识。
我的建议是完全用python重写(最有可能是3.3)。 fortran代码的维护与您期望的一样困难,并且测试结果与您想象的一样差。显然python在这里会有很多帮助。
在python中的文件处理速度方面是否存在任何性能命中(甚至增益)?目前,该系统的大部分运行时间是读/写文件。
提前致谢
答案 0 :(得分:3)
Python标准库的IO部分是作为高效的C代码实现的,所以我看到的性能比例如Java,特别是在程序是IO绑定的情况下(与CPU绑定相反)。
回复:
目前,该系统的大部分运行时间是读取/写入文件。
此外,如果您的逻辑将文件作为流处理,而不是整个文件的内容,那么在迁移到Python时,如果使用正确的工具,则实际上可能会看到性能提升。基本上,我们的想法是以块的形式读取输入,处理块并立即将结果写入输出文件。这可以最大限度地减少内存使用和延迟,特别是如果您的管道包含多个步骤。 Python生成器允许以非常干净,可读和简洁的方式编写这样的逻辑,这是你在Fortran或C中找不到的东西,至少没有一些额外的努力来构建这样的抽象(即使这样你最终也会非常神奇和/或神秘的代码)。
请参阅 http://www.dabeaz.com/generators/ ,了解有关使用生成器在Python中进行文件处理的非常好的文章。
此外,根据处理算法的性质和复杂程度,您可能会发现其他抽象(例如coroutines)或库(gevent,numpy等)可用在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>