首次执行Python读pickle代码耗时超5秒,后续仅0.2秒,求原因及排查恶意软件
技术疑问
我将numpy ndarray以pickle格式存储在外部HDD中,编写代码读取所有文件并合并为总ndarray。在Linux环境下,开机后首次通过venv运行该代码耗时超5秒,后续执行仅需0.2秒。我最初怀疑是pycache的额外耗时,但不确定,想搞清楚:
- 为何代码首次执行耗时远长于后续?
- 是否需要担心恶意软件?
相关代码
read_pickle.py
#!/home/****/bin/python3 # coding=utf-8 from os import listdir from os.path import isfile, join import multiprocessing import numpy as np import pandas as pd import time as t from utilsC0 import read_pickle_from_file from enums import * def process(file): directory = "some localization" # external hdd path = directory + f"/{file}" arr = read_pickle_from_file(path) return arr def f2(): directory = "some localization" # external hdd onlyfiles = [f for f in listdir(directory) if isfile(join(directory, f))] with multiprocessing.Pool() as p: result = p.map(process, onlyfiles) result = np.vstack(result) print("End f2") if __name__ == "__main__": t1 = t.time() f2() t2 = t.time() print(f"{t2 - t1}")
main.sh
#!/usr/bin/env bash source /home/***/bin/activate python3 src/read_pickle.py
问题解答
首次执行耗时更长的原因
这大概率和__pycache__无关,主要是以下几个正常机制导致:
- 外部HDD的系统缓存:Linux会把近期访问的磁盘数据存入内存页缓存(page cache)。首次运行时,pickle文件需要从外部HDD实际读取,速度受限;后续运行时,数据已经在内存缓存中,直接读取内存的速度远快于磁盘。你可以通过执行
sync; echo 3 > /proc/sys/vm/drop_caches清空缓存后再运行,会回到首次的慢速度,以此验证。 - 虚拟环境与库的初始化:首次激活venv并运行代码时,Python需要加载虚拟环境中的numpy、pandas等依赖库,包括动态链接库的加载、模块初始化,这些都需要时间。后续运行时,系统会缓存这些已加载的资源,启动速度大幅提升。
- 多进程启动开销:首次创建
multiprocessing.Pool时,需要启动多个子进程,进程的创建、初始化存在固定开销;后续运行时,系统可能复用了进程资源或缓存了相关初始化数据,开销明显降低。
关于恶意软件的担忧
当前现象完全符合正常的系统缓存和程序初始化逻辑,没有迹象指向恶意软件。恶意软件通常会伴随异常CPU占用、磁盘读写、网络行为,或出现系统卡顿、文件莫名修改等异常。如果仍有顾虑,可以用top/htop监控运行时资源占用,或用clamav等工具扫描系统及文件。
内容的提问来源于stack exchange,提问作者luki
相关产品推荐
相关产品推荐

