暂停 python 脚本以保存输出

pause python script to save output

我是 运行 python 中的一个代码,用于计算邻接矩阵的一些度量,我在其中循环遍历所有邻接矩阵,迭代写入一个 numpy 数组,然后保存循环结束时的数组。 正如我可以看到计算的进度,我发现其中一个矩阵的度量计算花费的时间太长(例如,不是通常的 5 秒,而是几个小时)。这是我的脚本:


longmat = scipy.io.loadmat('longmat.mat')
longmat = longmat['longmat']
matlength = longmat.shape
densval = np.arange(0, 1, 0.01)
betti = 0
output_long = np.zeros((264, 168, 12), dtype=float, order='F')

for z in range(matlength[2]): 
    for s in range(matlength[1]):
        temp = longmat[:, s, z] #vector of values
        tempr = scipy.spatial.distance.squareform(temp,checks=True)

        for dens in range(len(densval)):
            G_tda = gd.graph_density(densval[dens], tempr)
            B = bet.Betti_k(G_tda, betti, verbose=False)
            output_long[dens, s, z] = B
            if B < 2:
                break

scipy.io.savemat('longout.mat', {'output_long': output_long})

我想暂停脚本并保存数组输出直到此时,我想知道这是否可能。非常感谢您的帮助!

乔其纱

您需要 if 声明。

while true: # or a for loop
    #do the calculations here
    if condition: # condition is the metric before the one that takes too long to calculate
        open("test.txt", "a").write(output) # save the output to the file

只有当您知道哪个指标需要很长时间才能计算时,这才有可能。

更新: 现在您已经共享了您的代码,我可以看到一个更好的选择。您需要将 scipy.io.savemat() 放在最内层的循环中。如下:

longmat = scipy.io.loadmat('longmat.mat')
longmat = longmat['longmat']
matlength = longmat.shape
densval = np.arange(0, 1, 0.01)
betti = 0
output_long = np.zeros((264, 168, 12), dtype=float, order='F')

for z in range(matlength[2]): 
    for s in range(matlength[1]):
        temp = longmat[:, s, z] #vector of values
        tempr = scipy.spatial.distance.squareform(temp,checks=True)

        for dens in range(len(densval)):
            G_tda = gd.graph_density(densval[dens], tempr)
            B = bet.Betti_k(G_tda, betti, verbose=False)
            if B < 2:
                break
            output_long[dens, s, z] = B
            scipy.io.savemat('longout.mat', {'output_long': output_long}, appendmat=True)

这种方式在每个循环结束时 B 附加到输出文件。请注意 appendmat=True 确保不会发生覆盖。您可以查看其文档 here。我没用else,不过你可以用来美容。反正没必要。

如果不在 运行 脚本之前在我的循环中添加一行代码以迭代方式将输出保存到数组。