Performance 使用TimeIt管理设置代码
作为我的一个pet项目的一部分,我需要用Python测试代码的各种不同实现的性能。我预计这将是我经常做的事情,我想尝试使我为实现这一目标而编写的代码尽可能易于更新和修改 目前它还处于初级阶段,但我已经开始使用字符串来管理常见的设置或测试代码,例如:Performance 使用TimeIt管理设置代码,performance,python,timeit,Performance,Python,Timeit,作为我的一个pet项目的一部分,我需要用Python测试代码的各种不同实现的性能。我预计这将是我经常做的事情,我想尝试使我为实现这一目标而编写的代码尽可能易于更新和修改 目前它还处于初级阶段,但我已经开始使用字符串来管理常见的设置或测试代码,例如: naiveSetup = 'from PerformanceTests.Vectors import NaiveVector\n' \ + 'left = NaiveVector([1,0,0])\n' \ + 'right = NaiveVecto
naiveSetup = 'from PerformanceTests.Vectors import NaiveVector\n' \
+ 'left = NaiveVector([1,0,0])\n' \
+ 'right = NaiveVector([0,1,0])'
这使得我只需编写一次代码,但代价是使代码更难阅读,更新起来也很笨拙
有更好的方法吗?使用三重引号“”
timeit
的文档中提供了另一个有趣的方法:
def test():
"Stupid test function"
L = []
for i in range(100):
L.append(i)
if __name__=='__main__':
from timeit import Timer
t = Timer("test()", "from __main__ import test")
print t.timeit()
虽然这并不适合所有的需要。计时代码很好,但它仍然会让您猜测到底发生了什么 要了解实际发生的情况,请在调试器中手动将其随机暂停几次,然后检查调用堆栈 例如,在一个实现比另一个实现慢30倍的代码中,堆栈的每个样本都有96.7%的几率在其花费的额外时间内下降,因此您可以看到原因
不需要猜测。这与所问的问题完全无关。这是一种新颖的方法,但我不确定当Python中包含的探查器不是1个,而是3个(最后一次计数)时,为什么要以这种方式执行“探查”:cProfile、profile和hotshot。请参见@SilentGhost:OP我需要测试各种不同实现的性能。@Peter Rowell:仅仅因为探查器“在那里”,并不意味着主题已经结束。大多数探查器(包括您提到的那些探查器)基于gprof中的概念,即插装和程序计数器采样。以下是对这些问题的解释:……它是新颖的,并不广为人知,但如果您尝试它,您可能会看到(正如我和其他人所看到的)仪器和堆叠镜头之间的区别就像看运动和玩运动之间的区别。就像单色和彩色之间的区别。所有关于精度和测量的业务就像在2D中看问题,而你需要的是3D。没有比较。
def test():
"Stupid test function"
L = []
for i in range(100):
L.append(i)
if __name__=='__main__':
from timeit import Timer
t = Timer("test()", "from __main__ import test")
print t.timeit()