iPython %%timeit如何仅统计remove方法耗时排除容器构造开销
解决方案
你之前的写法把容器构造和remove操作放在同一个计时块里,最终统计的是两个操作的总耗时,当容器规模较大时,构造开销占比会很高,根本没法准确对比两个remove方法的真实性能差异。
直接用timeit(包括iPython封装的%timeit/%%timeit魔法)原生提供的setup机制即可解决问题:setup阶段的代码会在每一次执行计时语句前重新运行,且完全不会被计入最终耗时,刚好满足「每次迭代用全新容器、仅统计remove操作耗时」的需求。
行魔法写法(适合单语句测试)
通过-s(全写为--setup)参数传入容器构造代码,后面紧跟要计时的remove语句即可:
- 测试
list.remove性能:
%timeit -s "a_list = list(range(100))" a_list.remove(50)
- 测试
set.remove性能:
%timeit -s "a_set = set(range(100))" a_set.remove(50)
单元格魔法写法(适合多步计时逻辑)
如果计时逻辑不止一行,用%%timeit时同样把setup代码传给-s参数,单元格内部只写需要计时的代码即可:
%%timeit -s "a_list = list(range(100))" a_list.remove(50)
%%timeit -s "a_set = set(range(100))" a_set.remove(50)
避坑提示
不要用「全局初始化一次容器,每次remove完再把元素加回去」的写法,这种方案会把元素插回容器的开销也混入计时结果,还容易因为逻辑写错(比如漏加元素、元素顺序变化)导致测试结果失真。原生setup参数是专门为测试前置准备场景设计的,没有额外开销,逻辑也最可靠。
内容的提问来源于stack exchange,提问作者Daniel Walker
相关产品推荐
相关产品推荐

