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

pandas DataFrame使用apply调用HAPropsSI运行慢,有什么优化方案?

性能问题原因

你当前遇到的性能问题核心是pandas.DataFrame.apply按行遍历本质是Python层的循环,40万行规模下Python循环的开销会被无限放大,自然耗时极长。

你之前用np.vectorize报错的原因:np.vectorize并不是真正的向量化实现,只是语法糖,本质还是内部迭代调用函数,不会带来性能提升。你遇到的报错是因为HAPropsSI要求:如果传入数组作为数值参数,所有数值输入必须是同长度的1D数组/列表,你传的压力P是固定标量101325,和温度、相对湿度的数组长度不匹配,因此触发类型错误。


优化方案

方案1:直接使用HAPropsSI原生数组支持(性能最优)

CoolProp的HAPropsSI本身原生支持1D numpy数组作为输入,不需要额外封装,只需要把固定的压力值也转换为和温度、相对湿度同长度的数组即可,速度提升可达百倍级:

import pandas as pd
import numpy as np
from CoolProp.HumidAirProp import HAPropsSI

# 提取数组格式输入,避免pandas Series的额外开销
T_k = df['T'].values + 273.15
RH_dec = df['RH'].values / 100
# 生成和输入数组同长度的压力数组,值均为101325
P_arr = np.full_like(T_k, 101325)

# 直接调用HAPropsSI,原生向量化计算,无Python循环开销
df['H'] = HAPropsSI('H', 'T', T_k, 'P', P_arr, 'R', RH_dec)

方案2:Numba JIT编译加速(适合有自定义复杂逻辑的场景)

如果你后续有更复杂的计算逻辑,无法直接用HAPropsSI原生数组实现,可以用Numba对循环做JIT编译,把Python循环编译为机器码执行,性能接近原生向量化:

import numba
import numpy as np
from CoolProp.HumidAirProp import HAPropsSI

# 开启nopython模式,编译为纯机器码
@numba.njit
def calc_enthalpy(T_arr, RH_arr, P):
    n = len(T_arr)
    res = np.empty(n, dtype=np.float64)
    for i in range(n):
        res[i] = HAPropsSI('H', 'T', T_arr[i] + 273.15, 'P', P, 'R', RH_arr[i]/100)
    return res

# 传入numpy数组调用
df['H'] = calc_enthalpy(df['T'].values, df['RH'].values, 101325)

该方案首次运行会有编译开销,后续重复调用速度极快。

方案3:并行计算兜底

如果前两种方案都不适用,可以使用多进程并行的方式拆分apply任务到多CPU核心执行,相比单线程apply也能获得和核心数接近的加速比。


内容的提问来源于stack exchange,提问作者Zephyr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:00:01