Windows上的Python CPU时间

时间:2016-11-24 22:49:31

标签: python python-3.x time

我正在寻找一种方法来测量我的python程序部分的CPU时间。我环顾四周,似乎一直在测量功能,我可以找到测量窗口上的挂钟时间。有没有办法在Windows上测量python的CPU时间?谢谢。

2 个答案:

答案 0 :(得分:2)

<强> time.process_time()

https://www.python.org/dev/peps/pep-0418/

  

新的time.process_time()函数充当便携式计数器   总是测量CPU时间(不包括睡眠期间经过的时间)并具有   最好的分辨率。

对于想要将timeit()用于平均值的人来说,

早期回答

我最近在学习Python时写了这篇文章。这是一个timeit.Timer类迭代 timeit(),用于平均函数;在我的研究时间似乎很容易搞砸和timeit()显然很难工作(虽然更容易在命令行上工作)。这很有效。

另请注意,这个答案表明,对于Python 3.3+,最好的选择是time.process_time(),并提醒.default_timer()是壁挂时间:

https://stackoverflow.com/a/15176730/3981745

""" Sum a range with timing/comparisons.

    - Manually summing from low..high : a beginner's loop with no algorithms experience
    - Python's sum() - does the same thing for an "efficient" programmer
    - Fast sum - a programmer with math focus 
    - Timing calls (easy to do wrong)

    This is a trivial formula to demonstrate what a little math can do; for games this type of optimization is critical. It could probably be even more optimized.
"""

def slow_way(lo, hi):
    s=0
    for i in range(lo, hi+1):
        s+=i
    return s

def fast_way(lo, hi):
    lph=lo+hi        # lo plus hi
    hmlpo=hi-lo+1    # hi minus lo plus one
    pairs=hmlpo//2

    #print("-", lo,hi,pairs, pairs*lph, (lo+pairs)*(hmlpo%2))

    return (pairs*lph + (lo+pairs)*(hmlpo%2))

import timeit
# 'builtin' hack doesn't seem to work
#import __builtin__
#__builtin__.__dict__.update(locals()) 

ranges=[]
ranges.append((1,10,))
ranges.append((2,10,))
ranges.append((3,10,))
ranges.append((4,10,))
ranges.append((5,10,))
ranges.append((32,10032,))

print("Calculation check...")
print("slow : sum : fast : should all match")
for tupl in ranges:
    l=tupl[0]; h=tupl[1]
    print("{} : {} : {}".format(slow_way(l,h), sum(range(l, h+1)), fast_way(l,h)))

iters=100000
print("-"*20 +"\nTime compare ({} iterations) : lower is better".format(iters))
slow=timeit.Timer("slow_way(1,101)", "from __main__ import slow_way")
print("slow: {0:.6f}".format(slow.timeit(number=iters)))

# functions include last number, range should be +1
s=timeit.Timer("sum(range(1,102))", "")
print(" sum: {0:.6f}".format(s.timeit(number=iters)))

fast=timeit.Timer("fast_way(1,101)", "from __main__ import fast_way")
print("  fast: {0:.6f}".format(fast.timeit(number=iters)))

输出

Calculation check...
slow : sum : fast : should all match
55 : 55 : 55
54 : 54 : 54
52 : 52 : 52
49 : 49 : 49
45 : 45 : 45
50325032 : 50325032 : 50325032
--------------------
Time compare (100000 iterations) : lower is better
slow: 4.719885
 sum: 0.963886
  fast: 0.343524

答案 1 :(得分:0)

<强> time.clock()

在Windows上,您可以使用time.clock(),它基本上使用Windows API中的QueryPerformanceCounter()

QueryPerformanceCounter的():

  

检索性能计数器的当前值,该值是一个高分辨率(<1us)时间戳,可用于时间间隔测量。

以下是python docs中time.clock的详细说明:

  

在Unix上,将当前处理器时间返回为以秒为单位的浮点数。精度,实际上是“处理器时间”含义的定义,取决于同名C函数的精度,但无论如何,这是用于对Python或时序算法进行基准测试的函数。   在Windows上,此函数返回自第一次调用此函数以来经过的挂钟秒,作为浮点数,基于Win32函数QueryPerformanceCounter()。分辨率通常优于1微秒。

<强> timeit

如果您需要更准确的内容,则timeit。这个答案解释了timeithttps://stackoverflow.com/a/17579466/2394967

的好处