2015-06-19 12 views
5

Ho scritto una funzione che salva tutti i numeri tra gruppi di due cifre in un file di testo, con un'opzione di passaggio per risparmiare spazio e tempo, e non sono riuscito a capire come mostrare un valore percentuale, quindi ho provato questo .Qual è il modo migliore per calcolare la percentuale di un'operazione di iterazione?

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..." 

Quello che ho cercato di fare qui è stato rendere il programma fare un'iterazione tutte le volte che di solito avrebbe fatto, ma invece di scrivere su un file, ho appena fatto conteggio variabile percent_quotient quante volte l'iterazione è in realtà sta per essere ripetuto. (Ho chiamato la variabile fittizia j poiché è lì solo per interrompere il ciclo; mi dispiace se c'è un'altra espressione per questo.) La seconda parte è il lavoro effettivo e metto la variabile contatore, e la divido con percent_quotient e moltiplica con 100 per ottenere una percentuale.

Il problema è che quando ho provato a creare un dizionario dalla lunghezza 1 alla lunghezza di 8, in realtà ho impiegato un minuto per contare tutto. Immagino che ci vorrebbe molto più tempo se volessi creare un dizionario ancora più grande.

La mia domanda è, c'è un modo migliore/più veloce per farlo?

+2

Il tuo post ha avuto un po 'di intimidatorio per la sua lunghezza, quindi ho rifilato alcune delle storie di fondo che ritengo che molti utenti qui percepirebbero irrilevanti. Spero di non aver tagliato troppo. Ovviamente, come richiedente, sei libero di ripristinare la mia modifica (come lo sono un numero di altri utenti qui in base al loro rappresentante). –

+0

No, tutto a posto, mi dispiace. Infatti, grazie, immagino che più persone lo sfuggono se lo trovano troppo a lungo. – Meaty

risposta

0

Ok, la variabile di passo mi dà un sacco di mal di testa, ma senza di essa, questo sarebbe il modo giusto per calcolare quanti numeri saranno scritti.

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, grazie, la tua risposta mi ha aiutato a capirlo!

3

Non riesco davvero a capire cosa stia facendo. Ma sembra che sta facendo più o meno questo:

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() 

Se è vero, allora vi consiglio:

  • fare di meno looping codice e più matematica
  • Uso string.zfill() invece di while len(str(num)) < length: "0" + str(num)
  • Don' t sopraffare la console con l'output di ogni singolo numero, stampare solo un aggiornamento di stato ogni cento numeri, o ogni mille numeri, o giù di lì.
  • fare di meno str(int(str(int(str(int(str(int(...
  • Evitare "" + blah all'interno cicli stretti, se possibile, provoca le stringhe da ricostruire ogni volta ed è particolarmente lento.
+0

Mentre guardo la mia versione oltre il 1400% completa e conteggio ... lol. Probabilmente dovrei fare più matematica da solo. – TessellatingHeckler

+0

Grazie per il vostro aiuto, tutto sembra un po 'confuso visto che vedo per la prima volta alcuni metodi come zfill(). Non sono sicuro se percent_quotient è valido poiché è interessato dal passaggio. Lasciatemi provare a descriverlo brevemente. (scusate se ho qualcosa di sbagliato qui) Fondamentalmente, l'output del mio programma sarebbe: 0,2,4,6,8,00,02,04,06,08 fino a 99994,99996,99998.(con \ n ovviamente) Nel tuo caso, penso che quando "i" arriva alla fine del ciclo e diventa 10 ** limit_max, la percentuale equivale effettivamente a 100 * limit_min. In questo caso, sarebbe 100%, ma cosa succede se limit_min era 2 per esempio? – Meaty

+0

Tuttavia, il tuo codice mi ha aiutato molto, e nel caso avessi qualcosa di sbagliato, mi dispiace. Lo studio al mattino e cerco di eseguirlo, nel caso in cui abbia frainteso qualcosa. Lasciami aspettare un'altra risposta o due, solo per raccogliere qualche informazione in più, ma a parte questo, ho capito. Meno cicli, più matematica. Grazie! – Meaty

Problemi correlati