En python (3), je code un script qui utilise une boucle for récursive (la boucle for appelle sa propre fonction plusieurs fois) et je sais que le script ne se terminera qu'après environ 45 heures, donc je cherche un moyen de enregistrez la progression dans un fichier, fermez python, désactivez-le puis reprenez-le un autre jour.
Existe-t-il un moyen de sauvegarder la progression puis de la reprendre dans une autre (nouvelle) session ?
Exemple de boucle récursive:
i=1
def for_loop(i):
if i==10:
print(i)
#code
else:
for x in range(0, 10):
#code
for_loop(i+1)
Code entier :
def TheLoop(num_N, num_a, num_A, num_S, i):
global Key
global num_Keys
global num_Declined
global KeyTogether
global f
if i > 8:
if (num_N > 0) and (num_a > 0) and (num_A > 0) and (num_S > 0):
num_Keys = num_Keys + 1
KeyTogether = ''
for t in range(8):
try:
number = int(Key[t])
Key[t] = str(Key[t])
except ValueError:
pass
KeyTogether += Key[t]
#Output Key to a file
f.write(KeyTogether + "\n")
else:
# Invalid Key
num_Declined = num_Declined + 1
else:
if (num_N < 4) and ((i < 8) or ((num_a > 0) and (num_A > 0) and (num_S > 0))):
num_N = num_N + 1
for x in range(0, 10):
Key[i-1] = x
TheLoop(num_N, num_a, num_A, num_S, i+1)
if (num_a < 4) and ((i < 8) or ((num_N > 0) and (num_A > 0) and (num_S > 0))):
num_a = num_a +1
for c in "abcdefghijklmnopqrstuvwxyz":
Key[i-1] = c
TheLoop(num_N, num_a, num_A, num_S, i+1)
if (num_A < 4) and ((i < 8) or ((num_N > 0) and (num_a > 0) and (num_S > 0))):
num_A = num_A + 1
for c in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
Key[i-1] = c
TheLoop(num_N, num_a, num_A, num_S, i+1)
if (num_S < 4) and ((i < 8) or ((num_N > 0) and (num_a > 0) and (num_A > 0))):
num_S = num_S + 1
for c in '"'"!#$%&'()*+,-./:;<=>?@[\]^_`{|}~":
Key[i-1] = c
TheLoop(num_N, num_a, num_A, num_S, i+1)
Start = time.time()
TheLoop(0,0,0,0,1)
duration = time.time() - Start
print("Duration: " + str(duration))
print("Declined Keys: ", num_Declined)
print("Valid Keys: ", num_Keys)
duracionstr = str(duration)
f.write("Duration: " + durationstr)
Solution du problème
J'ai eu le même problème avec certaines boucles de longue durée dans un projet. J'ai créé une fonction qui exécute la boucle avec quelques mérites supplémentaires.
- La progression est enregistrée toutes les N itérations (pickle)
- Continuez là où vous vous étiez arrêté
- Si l'entrée se compose de plus d'un itérable, je boucle sur leur permutation.
- Barre de progression pour de beaux visuels.
Faites-moi savoir en cas de problème et je serai heureux de vous aider.
La fonction est disponible sur pip:
pip install daves_utilities
Usage:
from daves_utilities.for_long import for_long
letters = ["a","b","c","d"]
numbers = [10,20,40,100,500,1000]
attribute_dict = {"letters": letters, "numbers": numbers, "input_bool":True}
df_out = for_long(iter_fun = my_function, iter_attr = attribute_dict,\
save_every_n = 10, path = "./")
Aucun commentaire:
Enregistrer un commentaire