我想弄清楚我的LDA classifier预测单个1080维向量的类需要多长时间。我读了这些帖子:
并发现有几种方法可以做到这一点。我测试了一些但是它们产生了非常不同的结果。
import time
start = time.time()
lda.predict(sample)
end = time.time()
print(str((end-start)*10**6), 'µs')
>>> 1452.9228210449219 µs
timeit module's default_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)
我在这里做了一些荒谬的事情,还是对这些差异有其他解释?哪一个要信任?先感谢您。
答案 0 :(得分:1)
首先,您的系统中可能有几个时钟,具有不同的分辨率和精度。因此,一个时钟可能非常准确(gimme deez纳秒,m8!),而另一个时钟可能只测量整天的时间。可能没有人真正做到后者,但你明白了。我还发现了一个非常有趣的website来解释计算机如何测量时间。
其次,CPU没有总是以与其他许多其他事情相同的速度执行任务!它实际上不断地快速地在大量不同的任务之间切换,对我们来说,人类变慢,看起来它同时完成所有这些。好吧,不。所以,现在你的CPU可能比毫秒之前更加繁忙,这意味着你的任务可能会在几毫秒之后执行,或者反过来执行。
对于iPython的%timeit code
,它与您使用的其他方法不同,多次运行code
,因此,第一次运行可能需要很多时候,由于缓存,后续运行可能会快得多。因此,在这种情况下,在第一次运行期间,实际计算结果(这很慢)然后只是转储到内存,而另一个69999运行只是获取结果,这恰好比进行计算更快。我不认为您可以轻松地禁用缓存,因为缓存实际上是内置在CPU中的,因此任何重复性作业的结果可能会被缓存。
但后者可能并非如此。事实证明,%timeit
使用({1}}的子类(第139行of iPython's source code的定义和第945行的用法) * 禁用垃圾在测量时间之前收集而且这很可能是因为垃圾收集需要花费大量时间才能实现如此剧烈的加速,并且如果您的代码相当复杂,那么GC必然会有很多工作要做。
* 是的,我知道你可以直接链接到某条线路,但由于某种原因这对我不起作用,对不起。