鱼C论坛

 找回密码
 立即注册
查看: 213|回复: 1

FOR运算加速

[复制链接]
发表于 2023-12-19 23:53:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
for num in num_list:
        df = df1[df1['num'] == num]
        df.loc[:,A_col] = MinMaxScaler.fit_transform(df[A_col])

df_list.append(df)
df = pd.concat(df_list)


加速这个循环运算,尝试了concurrent.futures和JOBLIB进行并行运算,不熟练导致效果一般,应该如何写或者还有什么其他更好的方法,万分感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-19 23:53:39 | 显示全部楼层
在处理循环中的计算时,使用并行计算技术可以提高运算效率。下面是使用`concurrent.futures`库对给定的代码进行并行计算的示例:
  1. import concurrent.futures
  2. def process_num(num):
  3.     df = df1[df1 == num]
  4.     df.loc = MinMaxScaler.fit_transform(df)
  5.     return df
  6. def main():
  7.     df_list = []
  8.     with concurrent.futures.ThreadPoolExecutor() as executor:
  9.         futures = []
  10.         for num in num_list:
  11.             future = executor.submit(process_num, num)
  12.             futures.append(future)
  13.         
  14.         for future in concurrent.futures.as_completed(futures):
  15.             df = future.result()
  16.             df_list.append(df)
  17.    
  18.     df = pd.concat(df_list)
  19.     # 继续处理df
  20.    
  21. if __name__ == '__main__':
  22.     main()
复制代码

在上面的代码中,`process_num`函数用于将单个数字与`df1`中的数值匹配,进行计算和转换操作。通过使用`concurrent.futures.ThreadPoolExecutor`创建线程池,可以异步执行`process_num`函数,加快计算速度。最后,使用`as_completed`函数等待所有任务完成,并将结果添加到`df_list`中。

此外,你还可以尝试使用`concurrent.futures.ProcessPoolExecutor`替代`ThreadPoolExecutor`,以实现多进程并行计算。不过需要注意的是,在Windows系统下,由于`concurrent.futures`使用`pickle`进行对象序列化,可能会导致一些兼容性问题。如果你遇到类似问题,请考虑使用`joblib`库进行并行计算。

以下是使用`joblib`库的示例代码:
  1. from joblib import Parallel, delayed
  2. def process_num(num):
  3.     df = df1[df1 == num]
  4.     df.loc = MinMaxScaler.fit_transform(df)
  5.     return df
  6. def main():
  7.     num_cores = # 指定使用的CPU核心数量
  8.     df_list = Parallel(n_jobs=num_cores)(delayed(process_num)(num) for num in num_list)
  9.     df = pd.concat(df_list)
  10.     # 继续处理df
  11. if __name__ == '__main__':
  12.     main()
复制代码

在`Parallel`函数中,`n_jobs`参数指定要使用的CPU核心数量。`delayed`装饰器用于将`process_num`函数应用于每个数字,从而实现并行计算。最后,使用`pd.concat`将所有结果连接在一起。

希望这些示例能对加速你的循环运算有所帮助。请根据你的需求选择适合的方法进行使用。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 18:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表