百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Python中测量经过时间的方法(python测距)

wptr33 2025-05-11 01:43 30 浏览

技术背景

在Python开发中,我们经常需要测量一段代码或一个函数的执行时间,以此来评估代码的性能、优化算法或者比较不同实现方式的效率。Python提供了多种方法来实现时间测量,每种方法都有其特点和适用场景。

实现步骤

1. 使用time.time()

time.time()返回当前时间的时间戳(从纪元开始的秒数),可以通过记录开始和结束的时间戳来计算经过的时间。

import time

start = time.time()
print("hello")
end = time.time()
print(end - start)

这种方法简单直接,能得到代码执行的大致时间,但它受系统时间调整的影响,如NTP时间同步、手动调整系统时间等。

2. 使用timeit.default_timer

timeit.default_timer会根据不同的操作系统和Python版本自动选择最佳的时钟,在Python 3.3+中,它被赋值为time.perf_counter()

from timeit import default_timer as timer

start = timer()
# ...
end = timer()
print(end - start)

这种方法相对准确,能避免一些系统时间调整带来的问题。

3. 使用time.perf_counter()和time.process_time()(Python 3)

  • time.perf_counter():用于系统范围的计时,返回性能计数器的值,包括睡眠时间,具有较高的精度。
import time

t = time.perf_counter()
# do some stuff
elapsed_time = time.perf_counter() - t
  • time.process_time():用于进程范围的计时,不包括睡眠时间,只统计CPU的执行时间。
import time

t = time.process_time()
# do some stuff
elapsed_time = time.process_time() - t

4. 使用timeit模块

timeit模块可以更精确地测量代码的执行时间,它会多次执行代码并计算平均时间。

import timeit

def foo():
    return 1 + 1

time = timeit.timeit(foo, number=1000)
print(time)

从命令行使用timeit

python -mtimeit -s'import test' 'test.foo()'

5. 使用上下文管理器

可以自定义上下文管理器来方便地测量代码块的执行时间。

from contextlib import contextmanager
from timeit import default_timer

@contextmanager
def elapsed_timer():
    start = default_timer()
    elapser = lambda: default_timer() - start
    yield lambda: elapser()
    end = default_timer()
    elapser = lambda: end - start

import time

with elapsed_timer() as elapsed:
    time.sleep(1)
    print(elapsed())
    time.sleep(2)
    print(elapsed())
    time.sleep(3)

6. 使用装饰器

可以定义装饰器来测量函数的执行时间。

import time

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        original_return_val = func(*args, **kwargs)
        end = time.perf_counter()
        print("time elapsed in ", func.__name__, ": ", end - start, sep='')
        return original_return_val

    return wrapper

@timing_decorator
def function_to_time():
    time.sleep(1)

function_to_time()

核心代码示例

使用time.perf_counter()测量函数执行时间

import time

def my_function():
    for i in range(1000000):
        pass

start = time.perf_counter()
my_function()
end = time.perf_counter()
print(f"函数执行时间: {end - start} 秒")

使用timeit模块测量代码块执行时间

import timeit

code = """
for i in range(1000):
    pass
"""

execution_time = timeit.timeit(code, number=1000)
print(f"代码块执行时间: {execution_time} 秒")

最佳实践

  • 选择合适的方法:根据具体需求选择合适的时间测量方法。如果只需要大致的执行时间,可以使用time.time();如果需要更精确的测量,建议使用timeit模块或time.perf_counter()
  • 多次测量取平均值:为了得到更准确的结果,可以多次执行代码并计算平均时间。timeit模块会自动进行多次执行并计算平均值。
  • 避免干扰因素:在测量时间时,尽量避免其他程序的干扰,确保测量环境稳定。

常见问题

1. 测量结果不准确

  • 原因:系统时间调整、其他程序的干扰、垃圾回收等因素都可能影响测量结果。
  • 解决方法:使用timeit模块,它会自动处理垃圾回收等问题,并多次执行代码取平均值;选择合适的时钟函数,如time.perf_counter(),它受系统时间调整的影响较小。

2. timeit使用复杂

  • 原因timeit需要设置代码和执行次数,对于复杂的代码可能需要额外的设置。
  • 解决方法:可以将代码封装成函数,然后使用timeit测量函数的执行时间;也可以从命令行使用timeit,避免在代码中进行复杂的设置。

3. 测量结果包含睡眠时间

  • 原因:某些时钟函数(如time.perf_counter())会包含睡眠时间。
  • 解决方法:如果不需要包含睡眠时间,可以使用time.process_time()来测量CPU的执行时间。

相关推荐

oracle数据导入导出_oracle数据导入导出工具

关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...

继续学习Python中的while true/break语句

上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...

python continue和break的区别_python中break语句和continue语句的区别

python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...

简单学Python——关键字6——break和continue

Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...

2-1,0基础学Python之 break退出循环、 continue继续循环 多重循

用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...

Python 中 break 和 continue 傻傻分不清

大家好啊,我是大田。...

python中的流程控制语句:continue、break 和 return使用方法

Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...

L017:continue和break - 教程文案

continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...

作为前端开发者,你都经历过怎样的面试?

已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...

面试被问 const 是否不可变?这样回答才显功底

作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...

2023金九银十必看前端面试题!2w字精品!

导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...

前端面试总结_前端面试题整理

记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...

由浅入深,66条JavaScript面试知识点(七)

作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...

2024前端面试真题之—VUE篇_前端面试题vue2020及答案

添加图片注释,不超过140字(可选)...

今年最常见的前端面试题,你会做几道?

在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...