如何使用Python快速创建大文件

时间:2015-12-06 14:32:38

标签: python

我有以下代码用于生成大文本文件:

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

4 个答案:

答案 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 时代码不会停止