以最快的方式在fi中写入大量数据

2024-09-27 07:18:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个随机实数、整数、字母数字、字母字符串,然后写入文件,直到文件大小达到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秒才能完成。如何提高此程序的速度?请提供一些代码见解?


Tags: integersinimportselfforstringreturntime
3条回答

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

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

我相信这是可以改进的。我建议你带着你的侧写器转一圈。

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

  • while循环很慢,它有大约一百万次迭代。
  • 您没有正确使用I/O缓冲。不要打那么多系统电话。目前,您正在调用write()大约一百万次。

首先在Python数据结构中创建数据,然后只调用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"。然后在我的机器上测量的时间降到1秒以下。

如果您想更进一步地了解机器在写入磁盘时的速度,请使用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.

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

相关问题 更多 >

    热门问题