【问题标题】:What is the best way to get the execution time spent of a single line of code?获得单行代码执行时间的最佳方法是什么?
【发布时间】:2020-01-01 14:13:08
【问题描述】:

我正在尝试获取单行代码所花费的执行时间。像下面的示例中那样为多行和/或每次编写代码都这样做是令人沮丧的。有一个更好的方法吗?请参见下面的示例。

import pandas as pd
import datetime

start_time = datetime.datetime.now()
df = pd.read_csv('dummy.csv')
print('Time spent reading: {}'.format(datetime.datetime.now() - start_time))
start_time = datetime.datetime.now()
df.head(n=100)
print('Time spent printing top 100: {}'.format(datetime.datetime.now() - start_time)) 

【问题讨论】:

  • 使用profiler
  • 您的目标是什么,提高程序性能,或者只是向您的程序用户提供一些关于不同任务花费多长时间的信息?
  • 我们的目标是在不重复编写相同代码段的情况下获得执行单行代码所需的时间。比如:start_time = datetime.datetime.now()
  • @MehmedB:这没有告诉我们你为什么要这样做。您想要测量一行代码所花费的时间有不同的原因。这些不同的原因导致不同的答案。

标签: python python-3.x debugging time


【解决方案1】:

Python 具有可变参数(以及关键字参数)、参数默认值,并具有一流的函数。基本上,这意味着您可以将一个函数以及可选的所有参数和关键字参数传递给 另一个 函数。

from datetime import datetime

def record_time(task, args=(), kwargs={}):
    start_time = datetime.now()
    task(*args, **kwargs)

    return datetime.now() - start_time

print(record_time(print, ("test", )))

请记住,一元元组需要写为('foo', ),而不是('foo')


您还可以使用上下文管理器,它允许您对代码块而非单个函数进行计时。

import contextlib

from datetime import datetime
from time import sleep

@contextlib.contextmanager
def record_time():
    try:
        start_time = datetime.now()
        yield
    finally:
        print(datetime.now() - start_time)

with record_time():
    # Do a lot of stuff here...
    sleep(2)
    # Do more stuff if you like.

with record_time(): sleep(2)

本质上是impossible to actually return the time this way,但打印起来并不难。

【讨论】:

  • 我完全忘记了上下文管理器!非常感谢您提供的工作示例!
  • 很高兴能帮上忙!
【解决方案2】:

您可以使用模块timeit

使用示例

import timeit

timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)

Out[1]: 0.25778120000006766

这些代码在使用python 3 时运行良好。

您可以运行多个循环来确定任何可变性,当然您也可以用您自己的 oneliner 替换 ' ' 之间的代码。

更多信息可以在doc page上找到timeit

【讨论】:

  • 很好,我每天都在学习 Python 标准库中的更多工具。我对此进行了测试,担心 eval 会使测试中的代码性能降低,但使用datetime 减法可以忽略不计。
  • 请注意,在严重依赖外部进程(如 I/O)的函数上运行 timeit(),例如问题中的 read_csv,不会得到非常准确的计时。
  • 我知道 timeit,但我正在寻找一种方法来在更复杂的算法中对单行进行“计时”,由于执行需要时间,多次对单行计时几乎是不切实际的它只是一次。兴趣线有很多步骤。
猜你喜欢
  • 2011-01-05
  • 1970-01-01
  • 2013-02-24
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
相关资源
最近更新 更多