【问题标题】:Writing large number of large lists to a file将大量大列表写入文件
【发布时间】:2020-08-02 21:21:28
【问题描述】:

我想测试一个算法的效率,所以我决定制作一个包含所有输入测试用例的文本文件。我的主要目标是制作两个最大大小为 10^5 的不相交列表。所以最简单的方法是制作两个列表。

  • 列表 1 将从 0 开始,一直到 99999

  • 列表 2 将从 -100000 开始,一直到 -1

所以第一组列表将是

列表1:-100000

list2: 0

第二组将是

列表1:-100000 -99999

list2: 0 1

它将继续进行到第 10^5 次迭代

列表1:-100000 -99999 ... -1

list2: 0 1 ... 99999

所以我写了这段代码

#!/usr/bin/python3

ip = open("input.dat", "w+")

for length in range(1, 10**5+1):
    arr1 = [var1 for var1 in range(length)]
    arr2 = [var2-(10**5) for var2 in range(length)]
    ip.writelines(["%s " % item  for item in arr1])
    ip.writelines("\n")
    ip.writelines(["%s " % item  for item in arr2])
    ip.writelines("\n\n")

ip.close()

但这是非常低效的,并且需要很长时间来处理。有没有有效的方法来做同样的事情?

【问题讨论】:

  • 您可能不想在每次写入时都创建一个新列表。而是将缺少的项目附加到上一个列表中。此外,似乎没有必要在每个数字上附加一个空格。这是有原因的吗?
  • @PharoahJardin 感谢回复... )。顺便说一句,您的回答让我想到了一种尝试的方法,我可以生成一个大小为 10^5 的列表,然后使用它,我可以直接将其子列表写入文件,这似乎是一个可行的解决方案,但这只是提高内存效率,而不是时间效率,对吧?
  • 当然可以。但是将一系列连续整数写入文件似乎也没有必要。您不能只遍历算法本身的范围吗?
  • 所以我尝试运行你的代码的修改版本(而不是附加到一个列表),但它仍然没有完成运行所以我猜它仍然非​​常低效哈哈
  • @PharoahJardin 正如我所说,它仅用于测试目的,我希望它在一个 dat 文件中,以便我以后可以参考它。是的,很好,我们可以通过算法本身的范围,但这不是我的目的。好吧,我希望有一条出路。非常感谢您的帮助

标签: python list algorithm performance file


【解决方案1】:

这段代码效率更高,但对于10**5 的情况仍然无用。

#!/usr/bin/python3

ip = open("input.dat", "w+")

N = 10**4

string_arr1 = ""
string_arr2 = ""
for lenght in range(0, N):
    string_arr1 += "%s " % lenght
    string_arr2 += "%s " % (lenght-N)
    ip.write(string_arr1 + "\n")
    ip.write(string_arr2 + "\n\n")

ip.close()

在我的机器上,它运行不到 2 秒。

编辑:修正了一些错误。

【讨论】:

  • 非常有效的方法。您应该使用"%s " 来与 OP 的代码兼容。
  • 嗨,谢谢。 \n 什么时候写呢?如果我没记错的话,我认为它与 OP 的代码兼容。
  • OP 用空格分隔数字,并在第一个列表后添加一个换行符,在第二个列表后添加 2 个换行符。
  • 是的,但他使用.writelines() 方法在项目之间插入换行符。我使用.write() 方法所以我需要通过手动附加\n 来补偿。
  • 与常识相反,.writelines() 不会在项目之间插入换行符,也不会在最后一项之后添加换行符。它只是迭代其参数并将元素写入输出文件。
【解决方案2】:

不清楚您是否想要包含 1000 个或 100000 个项目的数组:105 是 100000,而不是您的问题中提到的 10000。

您不需要创建中间数组。只需迭代整数变量。使用以下代码,10000 个元素的运行时间减少了 23%(29.1 秒与 37.7 秒):

#!/usr/bin/python

# iterating to 10**4 generates a 538,995,000 byte file (539MB)
# iterating to 10**5 would produce more than 100x that much
max = 10000

ip = open("input.dat", "w+")

for length in range(1, max+1):
    ip.writelines(["%s " % item  for item in range(length)])
    ip.writelines("\n")
    ip.writelines(["%s " % item  for item in range(-max, length-max)])
    ip.writelines("\n\n")

ip.close()

时间用于将数组项转换为字符串并写入文件。创建数组更快,尤其是当创建延迟时,就像这里的情况一样。 ip.writelines 接受一个可迭代对象,它可能根本不会被构造。

【讨论】:

  • 您好,感谢您指出问题中的错误。进行了更改...感谢您的解决方案...
猜你喜欢
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多