Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 使用TimeIt管理设置代码_Performance_Python_Timeit - Fatal编程技术网

Performance 使用TimeIt管理设置代码

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

作为我的一个pet项目的一部分,我需要用Python测试代码的各种不同实现的性能。我预计这将是我经常做的事情,我想尝试使我为实现这一目标而编写的代码尽可能易于更新和修改

目前它还处于初级阶段,但我已经开始使用字符串来管理常见的设置或测试代码,例如:

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()