17

我想为我的代码片段计时,我只想要 CPU 执行时间(忽略操作系统进程等)。

我试过time.clock(),它看起来太不精确了,每次都给出不同的答案。(理论上,如果我为相同的代码片段再次运行它,它应该返回相同的值??)

我已经用 timeit 玩了大约一个小时。基本上对我来说扼杀它的是“设置”过程,我最终不得不导入大约 20 个函数,这是不切实际的,因为我实际上只是将我的代码重新写入设置部分以尝试使用它。

Cprofiles 看起来越来越有吸引力,但它们是否会返回 CPU 时间?还有一个小问题——它输出的信息太多了。有什么方法可以将输出的信息放入 txt 或 .dat 文件中,以便我实际阅读它?

干杯

操作系统:Ubuntu 程序:python 2.7

4

2 回答 2

19

听起来您正在寻找一种方法来计时整个进程的执行时间,您可以做的最好的事情是使用timeit.default_timer(),它提供了最精确的 time.clock() 或 time.time() 函数可用当前平台,但它是系统范围的时间,这意味着其他进程可能会干扰您的测量。

以下是 timeit.default_timer() 文档中的信息:

以特定于平台的方式定义默认计时器。在 Windows 上,time.clock() 的粒度为微秒,但 time.time() 的粒度为 1/60 秒。在 Unix 上,time.clock() 的粒度为 1/100 秒,而 time.time() 则更精确。在任一平台上,default_timer() 测量挂钟时间,而不是 CPU 时间。这意味着在同一台计算机上运行的其他进程可能会干扰计时。

您应该尝试测试可能可以访问不同时间 API 的 c 模块。


最好的方法是使用time.process_time(),它仅在python 3.3 及更高版本中可用,这是来自文档的信息:

返回当前进程的系统和用户 CPU 时间之和的值(以秒为单位) 。它不包括睡眠期间经过的时间。根据定义,它是进程范围的。返回值的参考点是未定义的,因此只有连续调用的结果之间的差异才有效。

于 2013-03-02T16:28:52.813 回答
5

代替time.clock(),使用timeit.default_timer(); 它为您的平台使用最准确的选项。例如,对于 Ubuntu,这将time.time()改为使用。

使用时timeit,创建一个设置函数,然后您可以重新使用它timeit。是的,这看起来有点工作,但它可以确保您对真正想要测量的内容进行计时,并且不会在时间关键的测量部分中包含设置代码。

于 2013-03-02T16:34:44.847 回答