摘要:在分析asyncio的源代码中遇到了一条奇奇怪怪的语句,就顺手做个总结。

常用的时钟

大概常用的就只有下面

import time
time.clock()
time.monotonic()
time.perf_counter()
time.process_time()
time.thread_time()
time.time()

time.time()

time.time()很常见,就是你在墙上挂着的钟表的时间。精度上相对没有那么高,而且受系统的影响(比如手动更改电脑的时间),适合表示日期时间或者大程序程序的计时。

time.perf_counter()

time.clock()和time.perf_counter()是一个东西,并且time.clock()在python3.8就会被删除。
返回性能计数器的值(以分数秒为单位),即具有最高可用分辨率的时钟,用于测量短时间。它包括睡眠期间经过的时间例如time.sleep(),并且是全系统的。返回值的引用点未定义,因此只有连续调用结果之间的差异才有效。貌似是当前程序的运行时间,没办法探究到底是什么,鬼知道

使用time.get_clock_info("clock")和time.get_clock_info("perf_counter")查看得:

>>> import time
>>> time.get_clock_info("clock")
namespace(adjustable=False, implementation='QueryPerformanceCounter()', monotonic=True, resolution=1e-07)
>>> time.get_clock_info("perf_counter")
namespace(adjustable=False, implementation='QueryPerformanceCounter()', monotonic=True, resolution=1e-07)
>>>

implementation应该是代表time.clock()通过调用QueryPerformanceCounter()来获取。resolution分辨率是计时的准确性,比如物理学上保留小数点后面多少位....

time.monotonic()

返回单调时钟的值(以小数秒为单位),即不能倒退的时钟。时钟不受系统时钟更新的影响。返回值的参考点未定义,因此只有连续调用结果之间的差异才有效。实际上就是打开 任务管理器 - 性能 - cpu - 正常运行时间,具体这个时间怎么来的不知道

import time
start = time.monotonic()
time.sleep(3)
end = time.monotonic()
print('start : {:>9.2f}'.format(start))
print('end : {:>9.2f}'.format(end))
print('span : {:>9.2f}'.format(end - start))

# 以秒为单位表示cpu的正常运行时间,打开 任务管理器 - 性能 - cpu - 正常运行时间 就可以看到

time.process_time()

返回当前进程的系统和用户CPU时间之和的值(以秒为单位)。不包括睡眠时间例如time.sleep()。从定义上讲,它是全过程的。返回值的引用点未定义,因此只有连续调用结果之间的差异才有效。感觉就是用来计算当前进程占据的cpu时间。因为sleep的时候,cpu会挂起当前进程去执行其他进程

import time

print('我是time()方法:{}'.format(time.time()))
print('我是perf_counter()方法:{}'.format(time.perf_counter()))
print('我是process_time()方法:{}'.format(time.process_time()))
t0 = time.time()
c0 = time.perf_counter()
p0 = time.process_time()
r = 0
for i in range(10000000):
    r += i
time.sleep(2)
print(r)
t1 = time.time()
c1 = time.perf_counter()
p1 = time.process_time()
spend1 = t1 - t0
spend2 = c1 - c0
spend3 = p1 - p0
print("time()方法用时:{}s".format(spend1))
print("perf_counter()用时:{}s".format(spend2))
print("process_time()用时:{}s".format(spend3))
print("测试完毕")

time.thread_time()

返回当前线程的系统和用户CPU时间之和的值(以秒为单位)。不包括睡眠时间例如time.sleep()。根据定义,它是线程特定的。返回值的引用点未定义,因此只有同一线程中连续调用的结果之间的差异才有效。感觉就是用来计算当前线程占据的cpu时间。因为sleep的时候,根据内核级线程以及用户级线程有所不同。用户级线程,cpu会挂起当前线程去执行其他进程。内核级线程,cpu会挂起当前线程去执行其他进程或者当前进程的其他线程。

import _thread, time


def print_time(threadName, delay):
    count = 0
    before = time.thread_time()
    while 1:
        for i in range(10000000):
            count = count + i
            pass
        print("{}:{}".format(threadName, time.ctime(time.time())))
        after = time.thread_time()
        # 子线程的执行时间
        print(threadName, "线程的执行时间", after - before)



try:
    _thread.start_new_thread(print_time, ("Thread-1", 10000000))
    _thread.start_new_thread(print_time, ("Thread-2", 20000000))
except:
    print("Error")

before = time.thread_time()
b = 1
while 1:
    for i in range(10000000):
        b = b + i
        pass
    time.sleep(5)
    after = time.thread_time()
    print("主线程的执行时间", after - before)
    pass
文章目录