2015-06-19 3 views
5

Я написал функцию, которая сохраняет все числа между двумя группами цифр в текстовый файл, с шагом, чтобы сохранить некоторое пространство и время, и я не мог понять, как показать процентное значение, поэтому я попробовал это ,Каков наилучший способ вычисления процента операции повторения?

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 переменного подсчета, сколько раз итерация на самом деле будет повторяться. (Я назвал переменную dunky j, так как она там только для разрыва цикла, извините, если для этого есть другое выражение.) Вторая часть - это фактическая работа, и я помещаю переменную счетчика, и я делю ее на percent_quotient и умножаю 100, чтобы получить процент.

Проблема в том, что когда я пытался сделать словарь с длиной от 1 до 8, на самом деле потребовалась минута, чтобы считать все. Я предполагаю, что это займет гораздо больше времени, если я захочу сделать еще больший словарь.

Мой вопрос в том, есть ли лучший/более быстрый способ сделать это?

+2

У вашего сообщения было немного пугающей длины, поэтому я урезал некоторые из предыстории, которые, как я чувствую, многие пользователи здесь воспринимают как несущественные. Надеюсь, я не слишком много перерезал. Конечно, в качестве искателя вы можете отменить мое редактирование (как и ряд других пользователей здесь, на основе их репутации). –

+0

Нет, все круто, извините. На самом деле, спасибо, я полагаю, что больше людей уклонятся от него, если они посчитают это слишком длинным. – Meaty

ответ

0

Хорошо, переменная шага дает мне много головной боли, но без нее это будет правильный способ рассчитать, сколько чисел будет записано.

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, спасибо, ваш ответ помог мне понять это!

3

Я не могу понять, что это делает. Но, похоже, это делает примерно так:

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)
  • Дона» t подавить консоль с выходом на каждый номер, только распечатать обновление состояния каждые 100 номеров или каждую тысячу номеров или около того.
  • ли меньше str(int(str(int(str(int(str(int(...
  • Избегайте "" + blah внутри плотные петли, если это возможно, приводит к струнам быть перестроены каждый раз, и это особенно медленно.
+0

Как я смотрю, моя версия поднимается за 1400% в полном объеме и рассчитывает ... lol. Я должен, наверное, сделать больше математики. – TessellatingHeckler

+0

Спасибо за помощь, все кажется немного запутанным, так как я вижу некоторые методы, такие как zfill() в первый раз. Не уверен, что percent_quotient хорош, так как на него влияет шаг. Позвольте мне кратко описать это. (извините, если у меня что-то не так) В принципе, выход моей программы будет: 0,2,4,6,8,00,02,04,06,08 до 99994,99996,99998.(с \ n, конечно) В вашем случае, я думаю, когда «i» доходит до конца цикла и становится 10 ** limit_max, процент фактически равен 100 * limit_min. В этом случае это будет 100%, но что, если limit_min было 2, например? – Meaty

+0

Однако ваш код очень помог мне, и в случае, если у меня что-то не так, извините. Я изучу это утром и попытаюсь запустить его, на случай, если я что-то неправильно понял. Позвольте мне подождать еще один ответ или два, просто чтобы получить дополнительную информацию, но кроме этого, я получил его. Меньше циклов, больше математики. Благодаря! – Meaty

Смежные вопросы