如何让Python在进入下一次循环前完成f.summary()与f.get_best()执行
解决方案
首先明确:Python是同步执行的,正常情况下f.summary()和f.get_best()会执行完毕后才进入循环的下一次迭代。你遇到的问题大概率是输出缓冲导致的视觉错觉,或是极端情况下f.fit()未完全释放资源就执行后续方法。以下是针对性解决办法:
1. 确保拟合完全完成
Fitter的fit()是同步方法,但将执行结果赋值给变量可强制程序等待拟合结束:
fit_result = f.fit()
2. 捕获最优分布结果,避免方法静默未执行
把get_best()的返回值保存下来,确保方法执行完毕:
best_dist = f.get_best(method='sumsquare_error') print(f"{col} 最优分布: {best_dist}")
3. 刷新输出缓冲区,解决视觉延迟
在所有print语句后添加flush=True,确保内容实时显示,避免和后续输出混淆:
print(col, flush=True)
4. 极端情况兜底:检查拟合状态
如果仍存在异常,可通过检查Fitter对象的内部属性确认拟合完成:
f.fit() # 等待拟合参数生成 while not hasattr(f, 'fitted_param') or f.fitted_param is None: time.sleep(0.5)
优化后的完整代码
import numpy as np import pandas as pd import seaborn as sns from fitter import Fitter, get_distributions from IPython.display import clear_output import warnings from pandas.core.common import SettingWithCopyWarning import time warnings.simplefilter(action="ignore", category=SettingWithCopyWarning) dataset = pd.read_csv("econ.csv") for col in dataset.columns: try: print(col, flush=True) spac = dataset[col].values f = Fitter(spac, distributions=get_distributions()) fit_result = f.fit() # 兜底检查拟合状态 while not hasattr(f, 'fitted_param') or f.fitted_param is None: time.sleep(0.5) f.summary() best_dist = f.get_best(method='sumsquare_error') print(f"{col} 最优分布: {best_dist}", flush=True) print("-"*50, flush=True) except Exception as e: print(f"处理列 {col} 出错: {str(e)}", flush=True) continue
关键调整说明
- 移除了重复的
import语句 - 替换空
except:为捕获具体异常,方便排查问题 - 所有输出添加
flush=True,避免视觉上的"未执行完成"错觉 - 通过捕获返回值+属性检查,强制程序等待关键步骤完成
内容的提问来源于stack exchange,提问作者Mikal Fischer
相关产品推荐
相关产品推荐

