有没有一种方法可以改善我的代码,该代码通过intertools.product函数的返回来生成具有10 ^ 8行的txt文件?

时间:2018-10-18 22:32:20

标签: python itertools

我想创建一个文本行,其中填充的行是在8个可能的位置上以10个数字重复进行排列的结果,我正在使用itertools.product函数,因为它返回了我应得的。问题是脚本花费的时间太长,并且(我想)是很多资源,基本上是处理器时钟。

我有以下代码:

from itertools import product

F = open("dic.txt", "w")
for option in product([0,1,2,3,4,5,6,7,8,9], repeat=8):
    line = str()
    for number in option:
        line += str(number)
    line += "\n"
    F.write(line)
F.close()

如果repeat参数仅为5

编辑:option是元组,这就是我再次循环的方式。

4 个答案:

答案 0 :(得分:1)

要回答这个问题很棘手,因为我认为有更简单的方法可以实现您的总体目标(我们仍然不知道)。但是您的代码可以像这样更好:

from itertools import product

with open("dic.txt", "w") as f:
    for option in product([0,1,2,3,4,5,6,7,8,9], repeat=8):
        f.write("{}\n".format("".join(str(o) for o in option)))

您还可以将选择列表替换为一个范围:

from itertools import product

with open("dic.txt", "w") as f:
    for option in product(range(10), repeat=8):
        f.write("{}\n".format("".join(str(o) for o in option)))

答案 1 :(得分:-1)

在执行写操作之前,您可以遍历更多行。 只需继续添加相同的字符串即可。在执行F.write(line)之前的1000次。这样一来,您可以节省一些开销,以便不断重复写入文件。

答案 2 :(得分:-1)

使用CPython实现细节的最大速度选项:将所有工作推入C,通过映射输出,使interpRWS = iterM lift where lift (Put s a) = modify (\t -> t ++ [s]) >> a lift (Get f) = reader head >>= local tail . f 重用其结果product,使{{1} }在请求下一个之前转换并释放,并使用tuple和原始tuple进行转换,以避免重复从int转换为bytes并避免所有转换编码开销:

int

其中一些优化可能会因您的用例而略有错误(例如,如果您使用的是Windows,并且希望行尾转换,如果您的语言环境不兼容ASCII等),但它们相对容易解决方法;对于仅使用纯换行符的ASCII兼容语言环境,这只是最简单的示例之一。

答案 3 :(得分:-2)

尝试

F = open("dic.txt", "w")
F.write('\n'.join([str(option) for option in product([0,1,2,3,4,5,6,7,8,9], repeat=8)]))
F.close()