如何避免每次运行Python脚本时重新加载数据(Spyder环境)
解决Spyder中重复加载大量CSV的高效方案
嘿,这个场景我太熟悉了——每次调参数都要重新跑一遍加载1000个CSV的代码,哪怕只有几秒,重复多了也真的闹心!别再用注释代码这种临时办法了,给你几个在Spyder里能用的高效解决方案:
1. 利用IPython内核的持久化特性
Spyder默认用的是IPython内核,它会保留你已经运行过的变量。你可以:
- 把加载CSV的代码单独选中,按
F9运行一次,这时候数据就已经存在内存里了; - 之后修改参数或变量名时,只需要运行后续的处理代码(同样选中后按
F9),完全不用重新加载文件; - 如果哪天需要更新数据,再重新跑一遍加载代码就行,平时不用碰它。
2. 给加载函数加缓存装饰器
用缓存把加载结果存起来,第一次加载后,后续调用直接用缓存,不用再读磁盘。推荐两种方式:
内存缓存(适合小到中等数据)
用Python标准库的functools.lru_cache,把加载逻辑封装成函数:
from functools import lru_cache import pandas as pd import os # 注意:lru_cache要求参数是可哈希类型,所以把文件路径列表转成元组 @lru_cache(maxsize=None) def load_all_csvs(file_paths): df_list = [] for path in file_paths: full_path = os.path.join("/your/csv/folder/", path) df_list.append(pd.read_csv(full_path)) return pd.concat(df_list, ignore_index=True) # 第一次调用会加载,之后直接取缓存 csv_paths = tuple(os.listdir("/your/csv/folder/")) dataset = load_all_csvs(csv_paths)
磁盘缓存(适合大数据)
如果数据太大,内存缓存放不下,用joblib把缓存存到磁盘,重启Spyder也能复用:
from joblib import Memory import pandas as pd import os # 创建缓存目录 memory = Memory(location="./csv_cache", verbose=0) @memory.cache def load_all_csvs(file_paths): df_list = [] for path in file_paths: full_path = os.path.join("/your/csv/folder/", path) df_list.append(pd.read_csv(full_path)) return pd.concat(df_list, ignore_index=True) csv_paths = os.listdir("/your/csv/folder/") dataset = load_all_csvs(csv_paths)
3. 合并CSV为高效格式(适合数据不常更新的情况)
如果这些CSV文件不会频繁修改,直接一次性合并成Parquet或Feather格式——这两种格式加载速度比CSV快N倍,还能压缩空间:
import pandas as pd import os # 仅第一次运行:合并所有CSV并保存 csv_folder = "/your/csv/folder/" all_dfs = [] for filename in os.listdir(csv_folder): if filename.endswith(".csv"): all_dfs.append(pd.read_csv(os.path.join(csv_folder, filename))) combined_df = pd.concat(all_dfs, ignore_index=True) combined_df.to_parquet("./combined_dataset.parquet") # 保存为Parquet # 之后每次直接加载这个文件就行 dataset = pd.read_parquet("./combined_dataset.parquet")
4. 用Spyder的“运行选中代码”功能
把脚本分成两部分:数据加载块和参数处理/测试块。修改参数后,只选中处理部分的代码按F9运行,不用执行整个脚本。这样也能避免重复加载数据。
内容的提问来源于stack exchange,提问作者shep4rd
相关产品推荐
相关产品推荐

