我想创建一个文本行,其中填充的行是在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
是元组,这就是我再次循环的方式。
答案 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()