Monte Carlo模拟中DataFrame高度碎片化性能警告问题求助
解决Monte Carlo模拟中DataFrame碎片化的性能警告方案
这个警告是因为你在循环里逐行修改DataFrame(results.loc[i, ...]),每次赋值都会打乱DataFrame的内存布局,导致碎片化,频繁调整内存不仅拖慢性能,还触发警告。下面是两种可行的解决思路:
方案一:向量化操作一次性生成所有数据(最优解)
numpy的随机函数支持直接生成指定数量的样本,完全不需要循环,性能提升几个量级,代码也更简洁:
import pandas as pd import numpy as np n_samples = 10000 # 一次性生成10000个样本数据 Power1 = np.random.normal(16000, 1000, n_samples) Power2 = np.random.triangular(12000, 15000, 18000, n_samples) Efficiency1 = np.random.normal(0.88, 0.10, n_samples) Efficiency2 = np.random.normal(0.85, 0.05, n_samples) TotalPower = (Power1 * Efficiency1) + (Power2 * Efficiency2) # 直接构建完整DataFrame results = pd.DataFrame({ 'Power1': Power1, 'Efficiency1': Efficiency1, 'Power2': Power2, 'Efficiency2': Efficiency2, 'TotalPower': TotalPower })
方案二:循环中收集数据到列表,最后统一转DataFrame(适合复杂逻辑场景)
如果模拟过程必须用循环(比如每次迭代有条件判断、依赖上一次结果等),不要直接修改DataFrame,而是把每一行数据存入列表,循环结束后再生成DataFrame:
import pandas as pd import numpy as np n_samples = 10000 data_list = [] for _ in range(n_samples): Power1 = np.random.normal(16000, 1000, 1)[0] # 取单个值,避免数组格式 Power2 = np.random.triangular(12000, 15000, 18000) Efficiency1 = np.random.normal(0.88, 0.10, 1)[0] Efficiency2 = np.random.normal(0.85, 0.05, 1)[0] TotalPower = (Power1 * Efficiency1) + (Power2 * Efficiency2) # 将当前行数据存为字典,加入列表 data_list.append({ 'Power1': Power1, 'Efficiency1': Efficiency1, 'Power2': Power2, 'Efficiency2': Efficiency2, 'TotalPower': TotalPower }) # 循环结束后一次性生成DataFrame results = pd.DataFrame(data_list)
临时修复已碎片化的DataFrame
如果已经存在碎片化的DataFrame,执行以下代码可以临时修复,但根源问题还是要避免逐行修改:
results = results.copy()
内容的提问来源于stack exchange,提问作者daggergeorge
相关产品推荐
相关产品推荐

