我有以下代码用于生成大文本文件:
d = 3
n = 100000
f = open("input.txt",'a')
s = ""
for j in range(0, d-1):
s += str(round(random.uniform(0,1000), 3))+" "
s += str(round(random.uniform(0,1000), 3))
f.write(s)
for i in range(0, n-1):
s = ""
for j in range(0, d-1):
s += str(round(random.uniform(0,1000), 3))+" "
s += str(round(random.uniform(0,1000), 3))
f.write("\n"+s)
f.close()
但即使产生5GB也似乎相当缓慢。
我怎样才能让它变得更好?我希望输出如下:
796.802 691.462 803.664
849.483 201.948 452.155
144.174 526.745 826.565
986.685 238.462 49.885
137.617 416.243 515.474
366.199 687.629 423.929
答案 0 :(得分:2)
嗯,当然,整个事情都是I / O绑定的。您无法输出该文件 比存储设备写得快。把它放在一边,那里 是一些可以做出的优化。
从几个较短的字符串构建长字符串的方法是
次优的。你基本上是在说s = s1 + s2
。当你告诉
Python做到这一点,它连接两个字符串对象来创建一个新的
字符串对象。这很慢,特别是重复时。
更好的方法是在列表中收集单个字符串对象
或其他可迭代的,然后使用join
方法一起运行它们。对于
例如:
>>> ''.join(['a', 'b', 'c'])
'abc'
>>> ', '.join(['a', 'b', 'c'])
'a, b, c'
而不是 n-1 字符串连接以加入 n 字符串,这样做 整个过程一步到位。
还有很多可以组合的重复代码。这是一个 更清洁的设计,仍然使用循环。
import random
d = 3
n = 1000
f = open('input.txt', 'w')
for i in range(n):
nums = []
for j in range(d):
nums.append(str(round(random.uniform(0, 1000), 3)))
s = ' '.join(nums)
f.write(s)
f.write('\n')
f.close()
更干净,更简洁,更Pythonic的方法是使用list comprehension:
import random
d = 3
n = 1000
f = open('input.txt', 'w')
for i in range(n):
nums = [str(round(random.uniform(0, 1000), 3)) for j in range(d)]
f.write(' '.join(nums))
f.write('\n')
f.close()
请注意,在这两种情况下,我都单独编写了换行符。那应该是 因为I / O是缓冲的,所以比将它连接到字符串更快 无论如何。如果我加入一个没有分隔符的字符串列表,我只是 在加入之前将换行符作为最后一个字符串。
正如丹尼尔的回答所说,numpy可能更快,但也许你没有 我想进入numpy;这听起来像是一个初学者 这一点。
答案 1 :(得分:1)
这可能会更快一些:
nlines = 100000
col = 3
for line in range(nlines):
f.write('{} {} {}\n'.format(*((round(random.uniform(0,1000), 3))
for e in range(col))))
或使用字符串格式:
for line in range(nlines):
numbers = [random.uniform(0, 1000) for e in range(col)]
f.write('{:6.3f} {:6.3f} {:6.3f}\n'.format(*numbers))
答案 2 :(得分:1)
使用numpy可能更快:
import numpy
d = 3
n = 100000
data = numpy.random.uniform(0, 1000,size=(n,d))
numpy.savetxt("input.txt", data, fmt='%.3f')
答案 3 :(得分:0)
我想如果您想使用无限循环并希望不受限制地制作如此大的文件,最好这样使用
import random
d = 3
n = 1000
f = open('input.txt', 'w')
for i in range(10**9):
nums = [str(round(random.uniform(0, 1000), 3)) for j in range(d)]
f.write(' '.join(nums))
f.write('\n')
f.close()
点击 ctr-c 时代码不会停止