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
相关产品推荐
相关产品推荐

