在文件中写入大量数据的最快方法

时间:2014-12-09 16:37:21

标签: python performance file

我正在尝试创建一个随机的实数,整数,字母数字,字母字符串,然后写入文件,直到文件大小达到 10MB

代码如下。

import string
import random
import time
import sys


class Generator():
    def __init__(self):
        self.generate_alphabetical_strings()
        self.generate_integers()
        self.generate_alphanumeric()
        self.generate_real_numbers()

    def generate_alphabetical_strings(self):
        return ''.join(random.choice(string.ascii_lowercase) for i in range(12))

    def generate_integers(self):
        return ''.join(random.choice(string.digits) for i in range(12))

    def generate_alphanumeric(self):
        return ''.join(random.choice(self.generate_alphabetical_strings() +
                                     self.generate_integers()) for i in range(12))

    def _insert_dot(self, string, index):
        return string[:index].__add__('.').__add__(string[index:])


    def generate_real_numbers(self):
        rand_int_string = ''.join(random.choice(self.generate_integers()) for i in range(12))
        return self._insert_dot(rand_int_string, random.randint(0, 11))


from time import process_time
import os

a = Generator()

t = process_time()
inp = open("test.txt", "w")
lt = 10 * 1000 * 1000
count = 0
while count <= lt:
    inp.write(a.generate_alphanumeric())
    count += 39
inp.close()

elapsed_time = process_time() - t
print(elapsed_time)

完成需要 225.953125秒。我怎样才能提高这个程序的速度?请提供一些代码见解?

3 个答案:

答案 0 :(得分:27)

观察到“缓慢”的两个主要原因:

  • 你的while循环很慢,它有大约一百万次迭代。
  • 您没有正确使用I / O缓冲。不要进行这么多系统调用。目前,您呼叫write()约一百万次。

首先在Python数据结构中创建数据,然后只调用一次<{em>}

这更快:

write()

输出:t0 = time.time() open("bla.txt", "wb").write(''.join(random.choice(string.ascii_lowercase) for i in xrange(10**7))) d = time.time() - t0 print "duration: %.2f s." % d

现在程序花费大部分时间生成数据,即duration: 7.30 s.内容。您可以轻松地将random替换为例如random.choice(string.ascii_lowercase)"a"。然后我的机器上的测量时间下降到一秒以下。

如果你想更接近看到你的机器在写入磁盘时的速度有多快,那么在将其写入磁盘之前,使用Python最快的(?)方式生成大数据:

>>> t0=time.time(); chunk="a"*10**7; open("bla.txt", "wb").write(chunk); d=time.time()-t0; print "duration: %.2f s." % d
duration: 0.02 s.

答案 1 :(得分:2)

你实际上创造了数十亿个物体然后迅速扔掉。在这种情况下,最好将字符串直接写入文件,而不是将它们与''.join()连接起来。

答案 2 :(得分:1)

主调用generate_alphanumeric下的while循环,它选择由(新鲜的随机生成的)字符串中的几个字符组成的十二个ascii字母和十二个数字。这与随机选择随机字母或随机数十二次基本相同。这是你的主要瓶颈。此版本将使您的代码速度提高一个数量级:

def generate_alphanumeric(self):
    res = ''
    for i in range(12):
        if random.randrange(2):
            res += random.choice(string.ascii_lowercase)
        else:
            res += random.choice(string.digits)
    return res

我确信它可以改进。我建议你带上你的探查器。