Python:将字母和数字组合写入文件

时间:2016-01-02 20:54:12

标签: python string performance file-io

我一直在查看其他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()

如果重复参数保持在3/4,此程序可以正常工作,但如果提高到5或更高,则程序无法完成 - 它不会崩溃,只是似乎永远不会完成。我猜这是一个性能问题,但我不确定。如果有人能提供更有效的计划,那将是非常感激的。

其次,我希望程序输出两个:

  • AEC
  • CEA

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

2 个答案:

答案 0 :(得分:7)

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

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

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

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'。)

答案 1 :(得分:0)

您可能想尝试一下:

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

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