我正在尝试创建一个随机的实数,整数,字母数字,字母字符串,然后写入文件,直到文件大小达到 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秒。我怎样才能提高这个程序的速度?请提供一些代码见解?
答案 0 :(得分:27)
观察到“缓慢”的两个主要原因:
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
我确信它可以改进。我建议你带上你的探查器。