time.clock()测量时长异常咨询:原因排查与稳定测量方案
关于
time.clock()受系统状态影响及稳定测量方案的解答 咱们先从time.clock()的实际行为说起——在你用的Ubuntu 18.04(Linux系统)+ Python环境里,time.clock()其实在Python 3.3之后就已经被重定向到time.process_time()了,它测的是你的进程实际占用的CPU时间(包括用户态和内核态的执行时间),本来是为了规避time.time()那种墙上时间受系统等待的影响,但这不代表它完全不受系统状态干扰。
为什么你的测量时长会越来越长?
你提到同一numpy操作的测量值从1900多秒涨到2700多秒,而且time.time()和time.clock()结果接近,这说明你的操作确实是纯CPU密集型(几乎没I/O等待),那导致变慢的大概率是这几个原因:
- 内存压力与GC抢占:你猜测的垃圾回收频繁真的很可能。虽然numpy是C实现,但如果你的代码循环里不断创建数组却没及时释放,内存碎片或者高占用会让系统开始偷偷用swap(哪怕你没主动磁盘操作,swap也是磁盘读写),或者Python的GC频繁触发抢CPU,直接拖慢执行速度。
- CPU热降频:如果服务器CPU长时间高负载跑,温度上去后会自动降频,主频一降,同一操作自然要花更久的时间——这时候不管是CPU时间还是墙上时间都会涨,因为实际执行指令的速度变慢了。
- 系统负载波动:哪怕你的screen会话是独立的,服务器上其他进程说不定在某个时间段占了更多CPU或内存带宽,numpy的操作非常依赖内存带宽,一旦被抢占,执行效率肯定下来。
给你几个稳定测量的替代方案
1. 换用更靠谱的测量函数
别再用time.clock()了,直接上Python 3.3+推荐的两个函数:
time.process_time():专门测当前进程的CPU占用时间,不含睡眠时间,精准反映CPU密集型操作的实际执行耗时。time.perf_counter():高精度的墙上时间测量,比time.time()准得多,适合看从开始到结束的总耗时。
给你个简单的代码示例:
import time # 记录开始时间 start_cpu = time.process_time() start_wall = time.perf_counter() # 这里放你的numpy操作代码 # ... # 记录结束时间 end_cpu = time.process_time() end_wall = time.perf_counter() print(f"实际CPU执行时间: {end_cpu - start_cpu:.2f}s") print(f"总耗时(含调度等待): {end_wall - start_wall:.2f}s")
2. 规避系统干扰的小技巧
- 多次测量取中位数:单次测量很容易被瞬时的系统波动影响,建议重复跑5-10次,去掉最高和最低值,取中位数或者平均,结果会稳定很多。
- 控制实验环境:测量前先用
top或htop看看服务器的CPU、内存使用率,关掉不必要的进程;如果是长时间跑的操作,让CPU冷却一会儿再测,避免热降频的影响。 - 手动清理内存:每次测量前可以手动触发GC(
import gc; gc.collect()),或者主动释放不用的numpy数组(比如del array_var),减少内存压力带来的干扰。
3. 简单的FLOPS统计方法
如果你想统计浮点运算次数,有这几个办法:
- 手动估算:根据numpy操作类型算。比如矩阵乘法
A @ B,如果A是(m,k),B是(k,n),浮点运算次数大概是2mk*n,用总次数除以CPU时间就能得到FLOPS。 - 利用BLAS/LAPACK的 verbose 模式:numpy一般会用OpenBLAS或MKL加速,你可以设置环境变量来让它们输出性能数据:
- 用MKL的话,运行脚本前加
export MKL_VERBOSE=1,会输出运算时间和FLOPS。 - 用OpenBLAS的话,加
export OPENBLAS_VERBOSE=2就能看到详细统计。
- 用MKL的话,运行脚本前加
- Linux自带的
perf工具:这是个神器,安装sudo apt install linux-tools-common后,用perf stat -e r530000 python your_script.py就能统计浮点运算次数(r530000是通用浮点事件代码,不同CPU可能有差异,也可以用perf list查看所有浮点相关事件)。
最后总结一下
你遇到的问题本质是系统状态(内存负载、CPU热降频、资源抢占)导致了执行效率下降,而time.clock()和time.time()都会如实反映这种变化。通过换用更可靠的测量函数、多次取中位数优化结果、控制实验环境,再配合BLAS/LAPACK或perf工具统计FLOPS,就能得到稳定的测量数据了。
内容的提问来源于stack exchange,提问作者Radio Controlled
相关产品推荐
相关产品推荐

