我试图创建一个随机实数、整数、字母数字、字母字符串,然后写入文件,直到文件大小达到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秒才能完成。如何提高此程序的速度?请提供一些代码见解?
main下的while循环调用
generate_alphanumeric
,它从由12个ascii字母和12个数字组成的(新鲜随机生成的)字符串中选择几个字符。这基本上等同于随机选择一个随机字母或随机数字12次。这是你的主要瓶颈。此版本将使代码速度提高一个数量级:我相信这是可以改进的。我建议你带着你的侧写器转一圈。
观察到“缓慢”的两个主要原因:
write()
大约一百万次。首先在Python数据结构中创建数据,然后只调用
write()
一次。这样更快:
输出:
duration: 7.30 s.
现在,程序将大部分时间花在生成数据上,即用
random
的东西。您可以很容易地看到,通过将random.choice(string.ascii_lowercase)
替换为例如"a"
。然后在我的机器上测量的时间降到1秒以下。如果您想更进一步地了解机器在写入磁盘时的速度,请使用Python最快的(?)在将数据写入磁盘之前生成较大数据的方法:
你真的创造了数十亿个物体,然后你很快就扔掉了。在这种情况下,最好将字符串直接写入文件,而不是将它们与
''.join()
连接起来。相关问题 更多 >
编程相关推荐