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

 虎爷2602900775 发布于 2022-12-07 10:23

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

1 个回答
  • 观察到"缓慢"的两个主要原因:

    你的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".然后测量的时间在我的机器上下降到一秒以下.

    如果你想更接近地看到你的机器在写入磁盘时的速度有多快,那么在将其写入磁盘之前,使用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.
    

    2022-12-11 02:08 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有