计算迭代操作百分比的最佳方法是什么?
What is the best way to calculate percentage of an iterating operation?
我写了一个函数,可以将两个数字组之间的所有数字保存到一个文本文件中,并带有一个步骤选项来保存一些 space 和时间,但我不知道如何显示百分比值,所以我尝试了这个。
for length in range(int(limit_min), int(limit_max) + 1):
percent_quotient = 0
j=0
while j <= (int(length * "9")):
while len(str(j)) < length:
j = "0" + str(j)
percent_quotient+=1
j = int(j) + int(step) # increasing dummy variable
for length in range(int(limit_min), int(limit_max) + 1):
counter=1
i = 0
while i <= (int(length * "9")):
while len(str(i)) < length:
i = "0" + str(i) #
print "Writing %s to file. Progress: %.2f percent." % (str(i),(float(counter)/percent_quotient)*100)
a.write(str(i) + "\n") # this is where everything actually gets written
i = int(i) + int(step) # increasing i
counter+=1
if length != int(limit_max):
print "Length %i done. Moving on to length of %i." % (length, length + 1)
else:
print "Length %i done." % (length)
a.close() # closing file stream
print "All done. Closed file stream. New file size: %.2f megabytes." % (os.path.getsize(path) / float((1024 ** 2)))
print "Returning to main..."
我在这里尝试做的是让程序像往常一样多次迭代,但我没有写入文件,而是让 percent_quotient 变量计算迭代次数实际上会重复。 (我调用了 j
虚拟变量,因为它只是为了打破循环;如果有另一个表达式,我很抱歉。)第二部分是实际工作,我放置了计数器变量,并将它除以percent_quotient
并乘以 100 得到百分比。
问题是,当我试图制作一个从长度为 1 到长度为 8 的字典时,它实际上花了一分钟来计算所有内容。我想如果我想制作更大的字典,我需要更长的时间。
我的问题是,是否有 better/faster 方法可以做到这一点?
我真的搞不懂这是在做什么。但它看起来大致是这样做的:
a = file('d:/whatever.txt', 'wb')
limit_min = 1
limit_max = 5
step = 2
percent_quotient = (10 ** (limit_max - limit_min)) / step
for i in range(limit_min, 10**limit_max, step):
output = str(i).zfill(limit_max) + '\r\n'
a.write(output)
if i % 100 < 2:
print "Writing %s to file. Progress: %.2f percent." % (str(i),(float(i)/percent_quotient)*100)
a.close()
如果是这样,那我建议:
- 少做代码循环,多做数学
- 使用
string.zfill()
代替while len(str(num)) < length: "0" + str(num)
- 不要让控制台不堪重负地输出每个数字,只在每百个数字或每千个数字左右打印状态更新。
- 少做
str(int(str(int(str(int(str(int(...
- 避免
"" + blah
内部紧密循环,如果可能的话,它会导致每次都重建字符串并且速度特别慢。
好吧,step 变量让我很头疼,但如果没有它,这将是计算要写入多少数字的正确方法。
percent_quota=0 #starting value
for i in range(limit_min,limit_max+1): #we make sure all lengths are covered
percent_quota+=(10**i)-1 #we subtract 1 because for length of 2, max is 99
TessellatingHeckler,谢谢你,你的回答帮助我解决了这个问题!
我写了一个函数,可以将两个数字组之间的所有数字保存到一个文本文件中,并带有一个步骤选项来保存一些 space 和时间,但我不知道如何显示百分比值,所以我尝试了这个。
for length in range(int(limit_min), int(limit_max) + 1):
percent_quotient = 0
j=0
while j <= (int(length * "9")):
while len(str(j)) < length:
j = "0" + str(j)
percent_quotient+=1
j = int(j) + int(step) # increasing dummy variable
for length in range(int(limit_min), int(limit_max) + 1):
counter=1
i = 0
while i <= (int(length * "9")):
while len(str(i)) < length:
i = "0" + str(i) #
print "Writing %s to file. Progress: %.2f percent." % (str(i),(float(counter)/percent_quotient)*100)
a.write(str(i) + "\n") # this is where everything actually gets written
i = int(i) + int(step) # increasing i
counter+=1
if length != int(limit_max):
print "Length %i done. Moving on to length of %i." % (length, length + 1)
else:
print "Length %i done." % (length)
a.close() # closing file stream
print "All done. Closed file stream. New file size: %.2f megabytes." % (os.path.getsize(path) / float((1024 ** 2)))
print "Returning to main..."
我在这里尝试做的是让程序像往常一样多次迭代,但我没有写入文件,而是让 percent_quotient 变量计算迭代次数实际上会重复。 (我调用了 j
虚拟变量,因为它只是为了打破循环;如果有另一个表达式,我很抱歉。)第二部分是实际工作,我放置了计数器变量,并将它除以percent_quotient
并乘以 100 得到百分比。
问题是,当我试图制作一个从长度为 1 到长度为 8 的字典时,它实际上花了一分钟来计算所有内容。我想如果我想制作更大的字典,我需要更长的时间。
我的问题是,是否有 better/faster 方法可以做到这一点?
我真的搞不懂这是在做什么。但它看起来大致是这样做的:
a = file('d:/whatever.txt', 'wb')
limit_min = 1
limit_max = 5
step = 2
percent_quotient = (10 ** (limit_max - limit_min)) / step
for i in range(limit_min, 10**limit_max, step):
output = str(i).zfill(limit_max) + '\r\n'
a.write(output)
if i % 100 < 2:
print "Writing %s to file. Progress: %.2f percent." % (str(i),(float(i)/percent_quotient)*100)
a.close()
如果是这样,那我建议:
- 少做代码循环,多做数学
- 使用
string.zfill()
代替while len(str(num)) < length: "0" + str(num)
- 不要让控制台不堪重负地输出每个数字,只在每百个数字或每千个数字左右打印状态更新。
- 少做
str(int(str(int(str(int(str(int(...
- 避免
"" + blah
内部紧密循环,如果可能的话,它会导致每次都重建字符串并且速度特别慢。
好吧,step 变量让我很头疼,但如果没有它,这将是计算要写入多少数字的正确方法。
percent_quota=0 #starting value
for i in range(limit_min,limit_max+1): #we make sure all lengths are covered
percent_quota+=(10**i)-1 #we subtract 1 because for length of 2, max is 99
TessellatingHeckler,谢谢你,你的回答帮助我解决了这个问题!