【问题标题】:How can I speed up this IronPython code that generates a string of arbitrary size如何加快生成任意大小字符串的 IronPython 代码的速度
【发布时间】:2015-03-17 03:10:33
【问题描述】:

我有一个在 C# 应用程序(我无法控制其源代码)中运行的 python 脚本,我希望这个脚本生成一个任意大小的文件。此文件中的数据无关紧要。我写了以下代码:

def generateFile(filename, size):
    file = open(filename, 'wb')
    file.write(''.join('0' for _ in range(size)))
    file.close()

IronPython 在这个 C# 应用程序中的集成总体上非常缓慢,但大部分都可以接受。然而,这段代码太慢了。生成一个 1KB 的文件大约需要 20 秒,而我需要生成大约 1M 或更大的文件。

经过一番调查,似乎缓慢主要来自生成用于写入文件的字符串。

是否有另一种方法可以在更快、可接受的时间内完成相同的任务?

【问题讨论】:

  • 试试file.write('0' * size)
  • @thefourtheye 效果很好.... o_o 请把它作为答案。我想我应该试试其他的。

标签: c# python string performance ironpython


【解决方案1】:

你可以使用

file.write('0'.zfill(size))

【讨论】:

  • 我将此标记为答案,但还有其他有效答案,例如@thefourtheye 在问题的 cmets 中所写的内容
【解决方案2】:

我不明白它怎么可能这么慢;

无论如何,这可能会有所帮助;我不是一次创建一个兆字节的字符串,而是生成 32K 并根据需要多次重复使用它。您可以使用块大小来查看最有效的方法。

在我的机器上,这会在 0.81 秒内写入一个 100MB 的文件。

CHUNK_SIZE = 32768       # 32k (arbitrary choice)

def generateFile(filename, bytes):
    n, r = divmod(bytes, CHUNK_SIZE)
    chunk = "0" * CHUNK_SIZE
    with open(filename, 'w') as outf:
        for _ in range(n):
            outf.write(chunk)
        outf.write(chunk[:r])

【讨论】:

  • 这可能是非常大的文件(几百 MB 或更多)的理想方法。然而,就我的需要而言,它有点复杂。
猜你喜欢
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 2020-05-03
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
相关资源
最近更新 更多