我一直在查看其他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或更高,则程序无法完成 - 它不会崩溃,只是似乎永远不会完成。我猜这是一个性能问题,但我不确定。如果有人能提供更有效的计划,那将是非常感激的。
其次,我希望程序输出两个:
使用此当前代码,它只会输出第一个。
答案 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()返回一个生成器,因此迭代它比在迭代之前收集所有响应更有效。