代码测量时间与实际耗时差异巨大,原因何在?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万+个元组元素:- 若RPi 3B的内存被其他进程占用较多,系统会触发磁盘swap交换——把内存中闲置数据写入SD卡,再读取所需数据,SD卡读写速度远慢于内存,这部分等待时间CPU处于空闲状态,不会被
process_time()统计。 - 即便内存充足,Python内存分配器处理大量小对象(每个元组包含6个字符对象)时,也会产生额外的调度开销,这些等待时间同样不计入CPU时间。
- 若RPi 3B的内存被其他进程占用较多,系统会触发磁盘swap交换——把内存中闲置数据写入SD卡,再读取所需数据,SD卡读写速度远慢于内存,这部分等待时间CPU处于空闲状态,不会被
- 秒表测量的是从命令启动到程序结束的总墙钟时间,涵盖了CPU计算、内存分配、swap读写、甚至终端输出的所有耗时,因此和代码统计的CPU时间差距极大。
至于time.time()和time.perf_counter()结果与process_time()一致,是因为你仅将计时范围限定在list(...)代码行——这行的CPU计算时间确实很短,而内存相关的等待时间本质上是在生成器迭代过程中伴随发生的,但并未被单独统计。
内容的提问来源于stack exchange,提问作者Andrew H
相关产品推荐
相关产品推荐

