You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

代码测量时间与实际耗时差异巨大,原因何在?RPi集群测试疑问

问题:Python代码计时与实际耗时差异巨大的原因?

我正在通过处理大型列表测试RPi集群,构建字符串列表以计算哈希值模拟加密货币挖矿,代码运行于Raspberry Pi 3B Rev 1.2。

构建列表的代码如下:

from pympler import asizeof
import itertools
import time

start = time.process_time()
combos = list(itertools.combinations_with_replacement('abcdefghijlkmnopqrstuvwxyz', 6))
stop = time.process_time()
print(len(combos), asizeof.asizeof(combos)/1e6, (stop-start))

运行结果:

andrew@master:~ $ python mem_test_1.py 
736281 70.727904 0.68859771

实际用秒表计时约45秒,与代码测量时间差距极大;在M2 MacBook上运行时也存在类似差异,且尝试time.time()和time.perf_counter()后结果一致。请问该时间差的原因是什么?


原因分析

时间差的核心是CPU执行时间与实际总运行时间的本质区别,具体拆解为以下几点:

  • time.process_time()仅统计Python进程实际占用CPU的计算时间,完全不包含CPU等待系统资源(如内存分配、磁盘swap交换)的耗时。
  • 当执行list(itertools.combinations_with_replacement(...))时,需要一次性生成并存储73万+个元组元素:
    1. 若RPi 3B的内存被其他进程占用较多,系统会触发磁盘swap交换——把内存中闲置数据写入SD卡,再读取所需数据,SD卡读写速度远慢于内存,这部分等待时间CPU处于空闲状态,不会被process_time()统计。
    2. 即便内存充足,Python内存分配器处理大量小对象(每个元组包含6个字符对象)时,也会产生额外的调度开销,这些等待时间同样不计入CPU时间。
  • 秒表测量的是从命令启动到程序结束的总墙钟时间,涵盖了CPU计算、内存分配、swap读写、甚至终端输出的所有耗时,因此和代码统计的CPU时间差距极大。

至于time.time()和time.perf_counter()结果与process_time()一致,是因为你仅将计时范围限定在list(...)代码行——这行的CPU计算时间确实很短,而内存相关的等待时间本质上是在生成器迭代过程中伴随发生的,但并未被单独统计。


内容的提问来源于stack exchange,提问作者Andrew H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:56:01