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

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

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

技术背景

在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的执行时间。

相关推荐

深度剖析 MySQL 数据库索引失效场景与优化策略

在互联网软件开发领域,MySQL数据库凭借其开源、高效等特性被广泛应用。而索引,作为提升MySQL查询性能的关键利器,能大幅加速数据检索。然而,在实际开发中,即便精心创建了索引,却常常遭遇索引失...

15分钟,带你了解indexedDB,这个前端存储方案很重要!

原文来源于:程序员成长指北;作者:Django强哥如有侵权,联系删除最近在给前端班授课,在这次之前的最后一次课已经是在2年前,2年的时间,前端的变化很大,也是时候要更新课件了。整理客户端存储篇章时模糊...

MySQL 面试总被问到的那些问题,你都懂了吗?

事务的四大特性是什么?首先得提一下ACID,这可是数据库事务的灵魂所在:原子性(Atomicity):要么全部成功,要么全部失败回滚。一致性(Consistency):确保数据在事务前后都处于一致状态...

Java 字符串常见的操作_java字符串总结

在Java当中,为字符串类提供了丰富的操作方法,对于字符串,我们常见的操作就是:字符串的比较、查找、替换、拆分、截取以及其他的一些操作。在Java中,有String,StringBuffer和St...

java学习分享:Java截取(提取)子字符串(substring())

在String中提供了两个截取字符串的方法,一个是从指定位置截取到字符串结尾,另一个是截取指定范围的内容。下面对这两种方法分别进行介绍。1.substring(intbeginIndex)形...

你必须知道的 7 个杀手级 JavaScript 单行代码

1.如果你需要一个临时的唯一ID,请生成随机字符串。这个例子将为你生成一个随机字符串:constrandomString=Math.random().toString(36).slice(2)...

MySQL 索引失效:原因、场景与解决方案

在互联网软件开发领域,MySQL作为一款广泛使用的关系型数据库,其性能优化至关重要。而索引,作为提升MySQL查询性能的关键手段,一旦失效,会导致查询效率大幅下降,影响整个系统的性能。今天,就来...

Axure9 教程:可模糊搜索的多选效果

一、交互效果说明1.点击话题列表中的话题选项,上方输入框内显示选择的话题标签,最多可选择5个标签,超出将有文字提示。2.点击输入框内已选择的话题标签的删除按钮,可以删除已选择的话题标签,并且该标签返回...

JavaScript字符串操作方法大全,包含ES6方法

一、charAt()返回在指定位置的字符。...

为什么MySQL索引不生效?来看看这8个原因

在数据库优化中,最让人头疼的事情之一莫过于精心设计的索引没有发挥作用。为什么会出现这种情况?这篇文章带大家一起探讨一些常见原因,方便大家更好地理解MySQL查询优化器是如何选择索引的,以及在出现类...

Kettle实现rabbitMQ的生产与消费_rabbitmq不支持顺序消费

文章目录一、Kettle为什么可以读取流数据?...

MySQL高频函数Top10!数据分析效率翻倍,拒绝无效加班!

引言:为什么你的SQL代码又臭又长?“同事3行代码搞定的事,你写了30行?”“每次处理日期、字符串都抓狂,疯狂百度?”——不是你不努力,而是没掌握这些高频函数!本文精炼8年数据库开发经验,总结出10个...

mysql的截取函数用法详解_mysql截取指定字符

substring()函数测试数据准备:用法:以下语法是mysql自动提示的1:substirng(str,pos):从指定位置开始截取一直到数据完成str:需要截取的字段的pos:开始截取的位置。从...

MySQL函数:字符串如何截取_mysql 字符串截取函数

练习截取字符串函数(五个)mysql索引从1开始...

数据集成产品分析(一)_数据集成工具有哪些

编辑导语:数据集成产品是数据中台建设的第一环节,在构建数据中台或大数据系统时,首先要将企业内部各个业务系统的数据实现互联互通,从物理上打破数据孤岛。本文作者对数据集成产品进行了分析,一起来看一下吧。数...