String 使用Python 3的大型文件的IO性能、预期结果、瓶颈?

String 使用Python 3的大型文件的IO性能、预期结果、瓶颈?,string,file-io,python-3.x,performance,String,File Io,Python 3.x,Performance,在Python 3中切片的性能如何? 我写了一个小程序,将7.1GB的字行处理成精简格式(中缀) 目前,我对文件集合的处理速度约为1.3MB/秒。我已经使用常用指南进行了一些改进,但我觉得我可能错过了真正的性能限制。我怀疑inFix()函数的字符串切片中存在瓶颈,但到目前为止还没有找到更快的解决方案。 我是否遗漏了一些重要的概念,或者Python不适合这样的任务 根据我的评论,最好的办法是使用较小的数据集在脚本上运行探查器,以查看时间的相对走向 然而,有两个简单的优化方法,你可以尽可能地寻找低

在Python 3中切片的性能如何?

我写了一个小程序,将7.1GB的字行处理成精简格式(中缀)

目前,我对文件集合的处理速度约为1.3MB/秒。我已经使用常用指南进行了一些改进,但我觉得我可能错过了真正的性能限制。我怀疑
inFix()
函数的字符串切片中存在瓶颈,但到目前为止还没有找到更快的解决方案。

我是否遗漏了一些重要的概念,或者Python不适合这样的任务


根据我的评论,最好的办法是使用较小的数据集在脚本上运行探查器,以查看时间的相对走向

然而,有两个简单的优化方法,你可以尽可能地寻找低挂果实

首先,将主处理循环移动到函数中,以利用优化的局部变量访问。这会产生惊人的巨大差异

其次,我将避免字符串格式化调用,而是使用字符串联接:

def infix2g(line):
    fragments = []
    for i in range(5):
        fragments.extend([
            'i ', inFix(line[1], i),
            ' ', inFix(line[2], i),
            ' ', inFix(line[3], i),
            '\t', line[0],
            '\n'])
    return ''.join(fragments)

根据我的评论,最好的办法是使用较小的数据集在脚本上运行探查器,以查看时间的相对变化

然而,有两个简单的优化方法,你可以尽可能地寻找低挂果实

首先,将主处理循环移动到函数中,以利用优化的局部变量访问。这会产生惊人的巨大差异

其次,我将避免字符串格式化调用,而是使用字符串联接:

def infix2g(line):
    fragments = []
    for i in range(5):
        fragments.extend([
            'i ', inFix(line[1], i),
            ' ', inFix(line[2], i),
            ' ', inFix(line[3], i),
            '\t', line[0],
            '\n'])
    return ''.join(fragments)

您是否尝试过在较小的数据集上启用分析并运行工具?这应该能让您了解执行时间的最大百分比在哪里,并且您可以相应地优化代码,我认为,与中缀函数相比,字符串格式更容易给您带来问题。您是否尝试过在较小的数据集上启用分析并运行工具?这应该能让您了解执行时间的最大百分比在哪里,并且您可以相应地优化代码,我想,与中缀函数相比,字符串格式可能会给您带来更多的问题。实际上,我想知道连接函数,因为字符串格式和连接操作都被推荐用于更快的操作。通过局部变量进行的优化我没有遇到过,所以谢谢你的提示。至于性能,我最终用Java编写了这个代码,它给了我大约30MB/秒的速度。Python似乎缺少与Java的StringBuilder类相当的性能。@Nemori:您是否尝试过ncoghlan关于分析和优化的建议?如果其他人花时间回答您的问题,请保持礼貌并尊重他们的努力。@Nemori:StringBuilder将一个字符串作为一组片段进行维护,然后在渲染最后一个字符串时将它们连接在一起。Python只是通过构建一个片段列表并将它们连接在一起来明确这一点。如果您的目标是最大限度地提高I/O吞吐量,那么这不太可能是最佳选择。事实上,我想知道join函数,因为字符串格式化和join操作都被推荐用于更快的操作。通过局部变量进行的优化我没有遇到过,所以谢谢你的提示。至于性能,我最终用Java编写了这个代码,它给了我大约30MB/秒的速度。Python似乎缺少与Java的StringBuilder类相当的性能。@Nemori:您是否尝试过ncoghlan关于分析和优化的建议?如果其他人花时间回答您的问题,请保持礼貌并尊重他们的努力。@Nemori:StringBuilder将一个字符串作为一组片段进行维护,然后在渲染最后一个字符串时将它们连接在一起。Python只是通过构建一个片段列表并将它们连接在一起来明确这一点。如果您的目标是最大化I/O吞吐量,那么这不太可能是最佳选择。