【问题标题】:Python: writing combinations of letters and numbers to a filePython:将字母和数字的组合写入文件
【发布时间】:2016-01-02 20:54:11
【问题描述】:

我一直在查看其他 SO 帖子,以便创建一个程序,该程序将在给定某些参数的情况下生成组合列表(字母 + 数字),我已经做到了:

from itertools import product
from string import *

keywords = [''.join(i) for i in product(ascii_letters + digits, repeat =  3)]
file = open("file.txt", "w")

for item in keywords: 
  file.write("%s\n" % item)

file.close()

如果 repeat 参数保持为 3/4,则该程序运行良好,但如果提高到 5 或更高,则程序不会完成 - 它不会崩溃,只是似乎永远不会完成.我猜这是一个性能问题,但我不确定。如果有人可以提供更有效的程序,将不胜感激。

其次,我希望程序同时输出:

  • aec
  • cea

使用这个当前代码,它只会输出第一个。

【问题讨论】:

  • 使用来自 itertools 的排列
  • 它对我有用。你确定你关闭了文件?你需要打电话给file.close() 而不是file.close
  • 它似乎仍然不适合我,有什么建议/理由吗?我会尝试排列。
  • 按照@ajcr 的建议,您应该在这里使用generator 表达式。但是程序仍然需要大量时间才能写入您的文件。

标签: python string performance file-io


【解决方案1】:

product(ascii_letters + digits, repeat=5) 为字符串 (62**5) 生成所有 916,132,832 种可能性。

在写入文件之前,您当前的代码会在内存中列出所有这些字符串对象。这对您的系统来说可能太多了,因为每个三字母字符串对象大约有 52 个字节(在 Python 3 中,在 Python 2 中略少)。这意味着您为列表创建了大约 44GB 的 Python 字符串。

相反,为keywords 使用generator 表达式以避免将所有字符串保存在内存中(只需使用(...) 而不是[...]):

keywords = (''.join(i) for i in product(ascii_letters + digits, repeat=5))

然后您可以像以前一样迭代并将字符串写入文件:

with open("file.txt", "w") as f:
    for item in keywords: 
        f.write(item)
        f.write('\n')

(另外,product(ascii_letters + digits, repeat=3) 生成“aec”和“cea”。)

【讨论】:

  • f.write(item+'\n')
  • 这是一个非常好的答案(y)
  • @IronFist:谢谢;这当然也可以,尽管item+'\n' 每次都会创建一个新字符串(我猜这会稍微慢一些,但我还没有计时......)。
  • @ajcr...请原谅我在这里缺乏知识..但它比写两次f慢吗?
  • @IronFist:这是一个有趣的观点。我只是尝试计时,它们似乎几乎完全相同。如果有的话,f.write(item+'\n') 稍微快一些(Python 似乎非常擅长连接短字符串)。我想在这种情况下两者都可以!
【解决方案2】:

你可能想试试这个:

file = open("file.txt", "w")
for item in product(ascii_letters + digits, repeat =  3):
  file.write('%s\n' % ''.join(item))
file.close()

这里我们避免将所有答案收集到一个大数组(关键字)中。 product() 返回一个生成器,因此对其进行迭代比在迭代之前收集其所有响应更有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 2013-12-07
    • 2020-08-04
    • 1970-01-01
    相关资源
    最近更新 更多