Python如何跨.py文件调用dataframe 避免重复读取增加耗时?
跨脚本复用SAS读取生成DataFrame的解决方案
当前重复耗时的核心原因:你在xyz.py中使用from abc import df1的写法时,Python会完整执行abc.py的所有顶层代码,所以每次导入都会重新触发SAS数据拉取逻辑,才会出现两次5分钟耗时的问题。
下面给出两种常用的落地方案:
- 方案1:本地缓存DataFrame(最推荐,适合多次运行脚本的场景)
将SAS拉取到的DataFrame存为本地二进制文件,后续导入时优先读本地缓存,仅当缓存不存在时才走SAS拉取逻辑。15万行的数据集读本地缓存耗时通常在1秒以内。
修改后的abc.py代码如下:
import pandas as pd import os # 自定义缓存文件存储路径 cache_file = "./df1_sas_cache.parquet" if os.path.exists(cache_file): # 存在缓存直接读取 df1 = pd.read_parquet(cache_file) else: # 无缓存时从SAS拉取数据 df1 = sas.sd2df('df_name', 'work') # 拉取后写入缓存,后续所有导入都不用再走SAS df1.to_parquet(cache_file, index=False)
xyz.py无需修改,仍用from abc import df1导入即可。如果后续SAS端的源数据更新,删除对应缓存文件就会自动重新拉取最新数据。
- 方案2:调度脚本统一拉取(适合单次运行整套逻辑、不想生成本地文件的场景)
把abc.py和xyz.py的业务逻辑封装为函数,不要把SAS读取、业务处理的逻辑写在顶层,再写一个主调度脚本统一拉取一次df1后传递给两个脚本的函数使用。
修改后的abc.py:
def fetch_df1_from_sas(): return sas.sd2df('df_name', 'work') def run_abc_biz(df1): # 此处填写abc.py中原有的其他业务处理逻辑 pass
修改后的xyz.py:
def run_xyz_biz(df1): # 此处填写xyz.py中原有的其他业务处理逻辑 pass
新增主调度脚本main.py:
from abc import fetch_df1_from_sas, run_abc_biz from xyz import run_xyz_biz if __name__ == "__main__": # 仅执行一次SAS拉取 df1 = fetch_df1_from_sas() # 分别调用两个脚本的业务逻辑,复用同一个df1 run_abc_biz(df1) run_xyz_biz(df1)
直接运行main.py即可,总耗时仅为一次SAS拉取的5分钟,无额外重复开销。
内容的提问来源于stack exchange,提问作者Arpit
相关产品推荐
相关产品推荐

