【问题标题】:Differences between performance measurement techniques for a single method in PythonPython中单个方法的性能测量技术之间的差异
【发布时间】:2018-03-04 18:45:22
【问题描述】:

我试图弄清楚我的LDA classifier 需要多长时间来预测单个 1080 维向量的类别。我阅读了这些主题:

并发现有几种方法可以做到这一点。我测试了其中的几个,但它们产生了非常不同的结果。

time module:

import time
start = time.time()
lda.predict(sample)
end = time.time()
print(str((end-start)*10**6), 'µs')
>>> 1452.9228210449219 µs

timeit module'sdefault_timer:

from timeit import default_timer as timer
start = timer()
lda.predict(sample)
end = timer()
print(str((end-start)*10**6), 'µs')
>>> 979.6129997994285 µs

iPython%timeit魔术函数:

%timeit lda.predict(sample)
>>> 52 µs ± 873 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

我在这里做了一些荒谬的事情还是对这些差异有其他解释?相信哪一个?先感谢您。

【问题讨论】:

    标签: python performance measure timeit


    【解决方案1】:

    首先,您的系统中可能有多个时钟,具有不同的分辨率和精度。因此,一个时钟可能非常准确(给我迪兹纳秒,m8!),而另一个时钟可能只测量一整天的时间。可能没有人真正做到后者,但你明白了。我还发现了一个非常有趣的website,它解释了计算机如何测量时间。

    其次,CPU 并不总是以与它有很多其他事情要做的速度相同的速度来完成您的任务!它实际上在大量不同的任务之间不断切换,速度非常快,对于我们这些行动缓慢的人类来说,它看起来像是同时完成所有这些工作。嗯,不。所以,现在你的 CPU 可能比几毫秒前更忙了,这意味着你的任务可能会在几毫秒之后执行,或者反过来。

    至于 iPython 的 %timeit code,与您使用的其他方法不同,它会运行 code 多次,因此,虽然第一次运行可能需要很多时间,但后续运行可能会由于缓存,速度要快得多。因此,在这种情况下,在第一次运行期间实际计算结果(这很慢)然后只是转储到内存中,而其他 69999 次运行仅获取该结果,这恰好比计算更快。我认为您不能轻易禁用缓存,因为缓存实际上是内置于 CPU 中的,因此 任何 重复作业的结果都可能会被缓存。


    不过,后者可能并非如此。事实证明,%timeit 使用 timeit.Timer(第 139 行的定义 of iPython's source code 和第 945 行的用法)* 之前 禁用垃圾收集(的子类)测量时间。这很可能是导致如此大幅度加速的原因,因为垃圾收集需要大量时间,而且如果您的代码相当复杂,GC 肯定有很多工作要做。


    * 是的,我知道你可以直接链接到某行,但由于某种原因这对我不起作用,对此感到抱歉。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 2011-02-22
      • 2011-05-16
      • 2011-03-23
      • 2011-09-16
      • 2016-10-28
      • 1970-01-01
      相关资源
      最近更新 更多