如何优化np.loadtxt读取大数值文件效率?避免重复读取
优化大文本文件重复读取的几种实用方案
你的痛点我太懂了——每次微调个绘图标题或者处理逻辑,都要重新解析12000行的文本文件,光读文件的时间都够喝杯咖啡了。结合你的Bash+Python工作流,给你几个针对性的优化方案:
1. 转存为二进制格式(最推荐,速度提升显著)
文本格式(比如你的.dat)虽然直观,但解析时要做大量字符串转浮点的操作,速度慢得离谱。Numpy的.npy二进制格式直接存储数组的内存结构,读取速度能快几十倍甚至上百倍。
具体实现:
- 先写个一次性的缓存生成脚本(或者在现有Python代码里加判断逻辑),把原始
.dat转成.npy:
import numpy as np import os root = os.environ["root"] paths = ["1leo_5fpps_pwat", "1leo_5fpps_u8", "1leo_5fpps_u8_t4"] for path in paths: dat_path = f"{root}/{path}/anal/all_frac.dat" npy_path = f"{root}/{path}/anal/all_frac.npy" # 只有当缓存不存在,或者原始文件更新时才重新生成 if not os.path.exists(npy_path) or os.path.getmtime(dat_path) > os.path.getmtime(npy_path): print(f"Generating cache for {path}...") xf = np.loadtxt(dat_path, dtype=float) np.save(npy_path, xf)
- 之后在你的
contour.py里,直接读取缓存文件即可:
# 替换原来的np.loadtxt代码 xf = np.load(npy_path)
配合Bash脚本的优化:
你可以在调用绘图脚本前先检查缓存,确保缓存是最新的:
prep_cache(){ printf "Checking and updating data cache...\n" python generate_cache.py } call_python(){ printf "Running contour plotting script...\n" python contour.py } # 执行顺序 prep_cache call_python
2. 拆分数据读取与处理/绘图逻辑
把代码拆成两个独立部分,彻底分离慢操作和频繁修改的部分:
load_data.py:专门负责读取原始文本、预处理,然后把数据保存为.npy或pickle格式的中间文件plot_and_process.py:直接加载中间数据,专注于绘图标题调整、下游处理逻辑的微调
这样每次改代码时,只需要运行plot_and_process.py,完全跳过耗时的文本读取步骤。
3. 内存映射文件(适合超大规模数据)
如果你的文件大到加载到内存都有压力,可以用Numpy的内存映射功能——它会把文件的一部分映射到内存,不用一次性加载整个文件,读取速度快还省内存:
# 先保存一次内存映射格式的文件(只需要做一次) xf = np.loadtxt(dat_path, dtype=float) np.save(dat_path + ".npy", xf) # 后续读取时用内存映射 xf = np.load(dat_path + ".npy", mmap_mode='r')
4. 小技巧:提前过滤无用数据
如果你的48列里不是所有列都用到,第一次读取时就只加载需要的列,减少数据量:
# 比如只加载第0、3、7列 xf = np.loadtxt(dat_path, dtype=float, usecols=(0,3,7))
这样不仅读取更快,后续的绘图和处理也会更高效。
内容的提问来源于stack exchange,提问作者WhySoSerious
相关产品推荐
相关产品推荐

