谨慎使用效率极低的std::list.size()函数

  linux环境下的一个刚完成的库函数效率极低,经测试发现瓶颈在std::list.size()函数,而我是这样使用的:while (aList.size()) { ... }

  查看stl源码(SGI版本,一般Linux都是使用这个)发现std::list.size()要遍历所有元素来获得列表长度,因此效率极低。我用 while (!aList.empty()) { ... }来代替,性能问题解决。
import os import rasterio import numpy as np from scipy.stats import pearsonr from tqdm import tqdm # ---------------------------- 通用函数定义 ---------------------------- def preprocess_data(data): """数据预处理,将无效值替换为NaN""" invalid_value = -3.4028230607370965e+38 data[data == invalid_value] = np.nan return data def z_score_normalize(data): """Z-score标准化(含零标准差处理)""" mean = np.nanmean(data) std = np.nanstd(data) # 处理无效标准差 if std == 0 or np.isnan(std): normalized = np.zeros_like(data) else: normalized = (data - mean) / std # 保留原始NaN位置 normalized[np.isnan(data)] = np.nan return normalized def local_pearson(raster1, raster2, window_size=5): """计算局部Pearson相关系数(含窗口有效性检查)""" rows, cols = raster1.shape corr_matrix = np.full((rows, cols), np.nan) p_matrix = np.full((rows, cols), np.nan) half_win = window_size // 2 # 镜像填充处理边缘 raster1_padded = np.pad(raster1, half_win, mode='reflect') raster2_padded = np.pad(raster2, half_win, mode='reflect') for i in tqdm(range(rows), desc="计算进度"): for j in range(cols): # 提取窗口数据 win1 = raster1_padded[i:i + window_size, j:j + window_size].flatten() win2 = raster2_padded[i:i + window_size, j:j + window_size].flatten() # 剔除无效值 mask = ~np.isnan(win1) & ~np.isnan(win2) valid_win1 = win1[mask] valid_win2 = win2[mask] # 打印窗口数据信息 valid_count = len(valid_win1) std_win1 = np.std(valid_win1) if valid_count > 0 else np.nan std_win2 = np.std(valid_win2) if valid_count > 0 else np.nan print(f"窗口 ({i}, {j}): 有效数据点数量: {valid_count}, 标准差1: {std_win1}, 标准差2: {std_win2}") # 严格有效性检查 if len(valid_win1) < 3 or len(valid_win2) < 3: continue if np.std(valid_win1) == 0 or np.std(valid_win2) == 0: continue # 跳过零标准差窗口 # 计算相关系数和p值
最新发布
03-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值