You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:02:52