我如何获得Python程序的执行时间?

joh*_*n2x 831 python time

我在Python中有一个命令行程序需要一段时间才能完成.我想知道完成跑步所需的确切时间.

我看过这个timeit模块,但它似乎只适用于小代码片段.我想要整个计划的时间.

rog*_*pvl 1452

Python中最简单的方法:

import time
start_time = time.time()
main()
print("--- %s seconds ---" % (time.time() - start_time))
Run Code Online (Sandbox Code Playgroud)

这假定您的程序至少需要十分之一秒才能运行.

打印:

--- 0.764891862869 seconds ---
Run Code Online (Sandbox Code Playgroud)

  • 这会计算实时(包括其他程序使用的时间)所以当你的计算机忙于做其他事情时似乎需要更多的时间 (47认同)
  • 在Windows上,做同样的事情,但使用time.clock()而不是time.time().您将获得稍微更好的准确性. (30认同)
  • 我建议做`round(time.time() - start_time,2)`(或者你想要的任何小数),我得到了科学数字,如1.24e-5. (28认同)
  • @ThorSummoner:你可能想要''%.2f'`而不是`round()`. (9认同)
  • 这种方法存在很大的缺陷.如果在程序运行时系统时间发生变化(如与时间服务器同步),则此方法不起作用或甚至可能破坏代码(负时间......) (6认同)
  • `time.clock()` 在 python 3.7+ 中已弃用,您会收到警告。从 python 3.3 开始,你最好做同样的事情,但使用 `time.process_time()` 或 `time.perf_counter()`。`perf_counter` 适合隔离单个函数,而 `process_time` 则捕获整个系统上 CPU 的实时时间。 (4认同)
  • @CoreyGoldberg:如果你想在Windows上使用`time.clock()`,在其他系统上使用`time.time()`,那么使用`timeit.default_timer()`.最近的Python版本是`time.perf_counter()`.虽然对于较大的间隔(天),`time.time()`可能在各处产生更好的结果. (3认同)
  • 使用“time.monotonic()”来避免由于更改系统时间/NTP而导致的错误。 (2认同)

Pau*_*McG 197

我把这个timing.py模块放到我自己的site-packages目录中,只需插入import timing我模块的顶部:

import atexit
from time import clock

def secondsToStr(t):
    return "%d:%02d:%02d.%03d" % \
        reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
            [(t*1000,),1000,60,60])

line = "="*40
def log(s, elapsed=None):
    print line
    print secondsToStr(clock()), '-', s
    if elapsed:
        print "Elapsed time:", elapsed
    print line
    print

def endlog():
    end = clock()
    elapsed = end-start
    log("End Program", secondsToStr(elapsed))

def now():
    return secondsToStr(clock())

start = clock()
atexit.register(endlog)
log("Start Program")
Run Code Online (Sandbox Code Playgroud)

timing.log如果我想要显示的程序中有重要的阶段,我也可以从我的程序中调用.但只是包括import timing将打印开始和结束时间,以及总体经过的时间.(原谅我的模糊secondsToStr功能,它只是将浮点数秒格式化为hh:mm:ss.sss形式.)

注意:可以在此处此处找到上述代码的Python 3版本.

  • 这是一个真正干净的解决方案,如果按Ctrl-C停止程序也可以. (7认同)
  • 对于Python 3,在顶部添加`from functools import reduce`并在每个print语句周围添加括号.效果很好! (7认同)
  • 注意:time.clock()是"从版本3.3开始不推荐:此函数的行为取决于平台:使用perf_counter()[使用时间睡眠]或process_time()[无时间睡眠]而不是根据您的要求,有明确的行为." (4认同)
  • @ PowerApp101 - 谢谢 - Nicojo 的回答提供了该模块的 Py3 友好版本。 (3认同)
  • @ c24b-调查profilehooks:https://pypi.python.org/pypi/profilehooks (2认同)

ste*_*eha 153

在Linux或UNIX中:

time python yourprogram.py
Run Code Online (Sandbox Code Playgroud)

在Windows中,请参阅此Stackoverflow讨论: 如何在windows命令行中测量命令的执行时间?

  • 是的,它提供了几秒钟.如果需要,您可以转换为min:秒.看看Paul McGuire的答案及其`secondsToStr()`函数. (3认同)

Nic*_*ojo 63

我非常喜欢Paul McGuire的回答,但我使用的是Python3.所以对于那些感兴趣的人:这里是他的答案的修改,适用于*nix上的Python 3(我想,在Windows下,应该使用clock()而不是time()):

#python3
import atexit
from time import time, strftime, localtime
from datetime import timedelta

def secondsToStr(elapsed=None):
    if elapsed is None:
        return strftime("%Y-%m-%d %H:%M:%S", localtime())
    else:
        return str(timedelta(seconds=elapsed))

def log(s, elapsed=None):
    line = "="*40
    print(line)
    print(secondsToStr(), '-', s)
    if elapsed:
        print("Elapsed time:", elapsed)
    print(line)
    print()

def endlog():
    end = time()
    elapsed = end-start
    log("End Program", secondsToStr(elapsed))

start = time()
atexit.register(endlog)
log("Start Program")
Run Code Online (Sandbox Code Playgroud)

如果你觉得这很有用,你应该继续投票给他的答案而不是这个,因为他完成了大部分的工作;).


new*_*cct 60

import time

start_time = time.clock()
main()
print time.clock() - start_time, "seconds"
Run Code Online (Sandbox Code Playgroud)

time.clock()返回处理器时间,这允许我们只计算此过程使用的时间(无论如何在Unix上).文档说"无论如何,这是用于基准测试Python或计时算法的函数"

  • 注意:time.clock() 是“自 3.3 版起已弃用:此函数的行为取决于平台:根据您的要求,使用 perf_counter() [with time slept] 或 process_time() [without time slept] 来代替有明确的行为。” (13认同)
  • time.time()最适用于*nix.time.clock()最适合在Windows上使用. (12认同)

Md.*_*yes 49

time.clock已在 Python 3.3 中弃用,并将从 Python 3.8 中删除:使用time.perf_counterortime.process_time代替

import time
start_time = time.perf_counter ()
for x in range(1, 100):
    print(x)
end_time = time.perf_counter ()
print(end_time - start_time, "seconds")
Run Code Online (Sandbox Code Playgroud)


jac*_*wah 47

您可以使用python profiler cProfile来测量CPU时间,以及每个函数内部花费的时间以及每个函数调用的次数.如果您想要在不知道从哪里开始的情况下提高脚本的性能,这非常有用.对另一个SO问题的答案非常好.在文档中查看也总是好的.

以下是如何使用命令行中的cProfile配置脚本的示例:

$ python -m cProfile euler048.py

1007 function calls in 0.061 CPU seconds

Ordered by: standard name
ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    0.061    0.061 <string>:1(<module>)
 1000    0.051    0.000    0.051    0.000 euler048.py:2(<lambda>)
    1    0.005    0.005    0.061    0.061 euler048.py:2(<module>)
    1    0.000    0.000    0.061    0.061 {execfile}
    1    0.002    0.002    0.053    0.053 {map}
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler objects}
    1    0.000    0.000    0.000    0.000 {range}
    1    0.003    0.003    0.003    0.003 {sum}
Run Code Online (Sandbox Code Playgroud)


met*_*mit 42

我喜欢datetime模块提供的输出,其中时间delta对象以人类可读的方式显示日期,小时,分钟等.

例如:

from datetime import datetime
start_time = datetime.now()
# do your work here
end_time = datetime.now()
print('Duration: {}'.format(end_time - start_time))
Run Code Online (Sandbox Code Playgroud)

样本输出例如

Duration: 0:00:08.309267
Run Code Online (Sandbox Code Playgroud)

要么

Duration: 1 day, 1:51:24.269711
Run Code Online (Sandbox Code Playgroud)

更新:正如JF Sebastian所提到的,这种方法可能会遇到一些当地时间的棘手案例,因此使用起来更安全:

import time
from datetime import timedelta
start_time = time.monotonic()
end_time = time.monotonic()
print(timedelta(seconds=end_time - start_time))
Run Code Online (Sandbox Code Playgroud)

  • @phansen:您可以在这里使用`timedelta(seconds=time.monotonic()-start)`(如果间隔很大,则可以使用`time.time()`)。[不要减去表示本地时间的原始日期时间对象;当地时间不单调](http://stackoverflow.com/a/26313848/4279) (2认同)

u0b*_*6ae 25

对Linux来说更好: /usr/bin/time

$ /usr/bin/time -v python rhtest2.py

    Command being timed: "python rhtest2.py"
    User time (seconds): 4.13
    System time (seconds): 0.07
    Percent of CPU this job got: 91%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.58
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 0
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 15
    Minor (reclaiming a frame) page faults: 5095
    Voluntary context switches: 27
    Involuntary context switches: 279
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0
Run Code Online (Sandbox Code Playgroud)

通常,只是time一个更简单的shell内置阴影能力更强/usr/bin/time.


Mat*_*att 19

对于使用Jupyter Notebook的数据人员

在一个单元格中,可以使用 Jupyter 的%%time魔法命令来测量执行时间:

%%time
[ x**2 for x in range(10000)]
Run Code Online (Sandbox Code Playgroud)

输出

%%time
[ x**2 for x in range(10000)]
Run Code Online (Sandbox Code Playgroud)

这只会捕获特定单元格的执行时间。如果您想捕获整个笔记本(即程序)的执行时间,您可以在同一目录中创建一个新笔记本并在新笔记本中执行所有单元格:

假设上面的笔记本被称为example_notebook.ipynb。在同一目录中的新笔记本中:

# Convert your notebook to a .py script:
!jupyter nbconvert --to script example_notebook.ipynb

# Run the example_notebook with -t flag for time
%run -t example_notebook
Run Code Online (Sandbox Code Playgroud)

输出

CPU times: user 4.54 ms, sys: 0 ns, total: 4.54 ms
Wall time: 4.12 ms
Run Code Online (Sandbox Code Playgroud)


Yas*_*Yas 12

time.clock()

从版本3.3开始不推荐使用:此函数的行为取决于平台:根据您的要求,使用perf_counter()process_time()来定义明确的行为.

time.perf_counter()

返回性能计数器的值(以小数秒为单位),即具有最高可用分辨率的时钟,以测量短持续时间.它确实包括睡眠期间经过的时间,并且是系统范围的.

time.process_time()

返回当前进程的系统和用户CPU时间总和的值(以小数秒为单位).它包括睡眠期间经过的时间.

start = time.process_time()
... do something
elapsed = (time.process_time() - start)
Run Code Online (Sandbox Code Playgroud)

  • 也许从结论开始,*“使用 time.process_time()”*(或类似的)? (3认同)

San*_*eep 11

以下代码段以一种漂亮的人类可读<HH:MM:SS>格式打印已用时间.

import time
from datetime import timedelta

start_time = time.time()

#
# Perform lots of computations.
#

elapsed_time_secs = time.time() - start_time

msg = "Execution took: %s secs (Wall clock time)" % timedelta(seconds=round(elapsed_time_secs))

print(msg)    
Run Code Online (Sandbox Code Playgroud)

  • 一直到这里,人们都会找到最理智的答案(“理智”的意思是尽可能多地依赖内置程序,因此打字最少)。 (3认同)

use*_*227 11

与@rogeriopvl 的响应类似,我添加了一个轻微的修改,使用相同的库将长时间运行的作业转换为小时分秒。

import time
start_time = time.time()
main()
seconds = time.time() - start_time
print('Time Taken:', time.strftime("%H:%M:%S",time.gmtime(seconds)))
Run Code Online (Sandbox Code Playgroud)

样本输出

Time Taken: 00:00:08
Run Code Online (Sandbox Code Playgroud)


DGS*_*DGS 11

我认为这是最好也是最简单的方法:

from time import monotonic

start_time = monotonic()
# something
print(f"Run time {monotonic() - start_time} seconds")
Run Code Online (Sandbox Code Playgroud)

或者使用装饰器:

from time import monotonic
    
def record_time(function):
    def wrap(*args, **kwargs):
        start_time = monotonic()
        function_return = function(*args, **kwargs)
        print(f"Run time {monotonic() - start_time} seconds")
        return function_return
    return wrap

@record_time
def your_function():
    # something
Run Code Online (Sandbox Code Playgroud)


小智 10

只需使用timeit模块.它适用于Python 2和Python 3

import timeit

start = timeit.default_timer()

# All the program statements
stop = timeit.default_timer()
execution_time = stop - start

print("Program Executed in "+execution_time) # It returns time in seconds
Run Code Online (Sandbox Code Playgroud)

它以秒为单位返回,您可以拥有执行时间.很简单但你应该在Main Function中编写这些函数来启动程序执行.如果你想获得执行时间,即使你得到错误,然后把你的参数"开始"给它并在那里计算

def sample_function(start,**kwargs):
     try:
         # Your statements
     Except:
         # Except statements
         stop = timeit.default_timer()
         execution_time = stop - start
         print("Program executed in " + execution_time)
Run Code Online (Sandbox Code Playgroud)

  • 不应该是“finally”部分下的那部分吗? (6认同)

Ped*_*ito 8

后来回答,但我使用内置的timeit

import timeit
code_to_test = """
a = range(100000)
b = []
for i in a:
    b.append(i*2)
"""
elapsed_time = timeit.timeit(code_to_test, number=500)
print(elapsed_time)
# 10.159821493085474
Run Code Online (Sandbox Code Playgroud)
  • 将所有代码(包括您可能拥有的任何导入)包装在code_to_test.
  • number 参数指定代码应重复的次数。
  • 演示

  • 如果您想对无法放入字符串的代码的某些部分进行计时怎么办? (3认同)
  • 是的,我讨厌在字符串中运行代码只是为了满足 _timeit()_ (3认同)

小智 8

我尝试使用以下脚本发现时差。

import time

start_time = time.perf_counter()
[main code here]
print (time.perf_counter() - start_time, "seconds")
Run Code Online (Sandbox Code Playgroud)


jfs*_*jfs 7

我看过timeit模块,但它似乎只适用于小代码片段.我想要整个计划的时间.

$ python -mtimeit -n1 -r1 -t -s "from your_module import main" "main()"
Run Code Online (Sandbox Code Playgroud)

它运行一次your_module.main()功能,并使用time.time()函数作为计时器打印已用时间.

/usr/bin/time在Python中模拟,请参阅使用/ usr/bin/time的Python子进程:如何捕获时序信息但忽略所有其他输出?.

要测量time.sleep()每个函数的CPU时间(例如,不包括时间),您可以使用profile模块(cProfile在Python 2上):

$ python3 -mprofile your_module.py
Run Code Online (Sandbox Code Playgroud)

如果要使用与模块使用相同的计时器,可以传递-ptimeit上面的命令profile.

请参阅如何配置Python脚本?


B.K*_*cis 7

Ipython"timeit"任何脚本:

def foo():
    %run bar.py
timeit foo()
Run Code Online (Sandbox Code Playgroud)


小智 7

from time import time
start_time = time()
...
end_time = time()
time_taken = end_time - start_time # time_taken is in seconds
hours, rest = divmod(time_taken,3600)
minutes, seconds = divmod(rest, 60)
Run Code Online (Sandbox Code Playgroud)


小智 7

我使用了一个非常简单的函数来计时一部分代码执行:

import time
def timing():
    start_time = time.time()
    return lambda x: print("[{:.2f}s] {}".format(time.time() - start_time, x))
Run Code Online (Sandbox Code Playgroud)

而要使用它,只需在代码之前调用它来衡量检索函数的时间,然后在带有注释的代码之后调用该函数。时间会出现在评论前面。例如:

t = timing()
train = pd.read_csv('train.csv',
                        dtype={
                            'id': str,
                            'vendor_id': str,
                            'pickup_datetime': str,
                            'dropoff_datetime': str,
                            'passenger_count': int,
                            'pickup_longitude': np.float64,
                            'pickup_latitude': np.float64,
                            'dropoff_longitude': np.float64,
                            'dropoff_latitude': np.float64,
                            'store_and_fwd_flag': str,
                            'trip_duration': int,
                        },
                        parse_dates = ['pickup_datetime', 'dropoff_datetime'],
                   )
t("Loaded {} rows data from 'train'".format(len(train)))
Run Code Online (Sandbox Code Playgroud)

然后输出将如下所示:

[9.35s] Loaded 1458644 rows data from 'train'
Run Code Online (Sandbox Code Playgroud)


han*_*ans 7

我在很多地方都遇到了同样的问题,所以我创建了一个便利包horology。您可以安装它,pip install horology然后以优雅的方式进行安装:

from horology import Timing

with Timing(name='Important calculations: '):
    prepare()
    do_your_stuff()
    finish_sth()
Run Code Online (Sandbox Code Playgroud)

将输出:

Important calculations: 12.43 ms
Run Code Online (Sandbox Code Playgroud)

或者更简单(如果你有一个功能):

Important calculations: 12.43 ms
Run Code Online (Sandbox Code Playgroud)

将输出:

main: 7.12 h
Run Code Online (Sandbox Code Playgroud)

它负责单位和舍入。它适用于 python 3.6 或更新版本。

  • @hans,恭喜这个库 - 很棒的工具。 (2认同)

小智 6

Timeit 是 Python 中的一个类,用于计算小块代码的执行时间。

Default_timer 是此类中的一个方法,用于测量挂钟计时,而不是 CPU 执行时间。因此其他流程执行可能会干扰这一点。因此它对于小代码块很有用。

代码示例如下:

from timeit import default_timer as timer

start= timer()

# Some logic

end = timer()

print("Time taken:", end-start)
Run Code Online (Sandbox Code Playgroud)


Ama*_*mar 6

首先,通过以管理员身份打开命令提示符(CMD)并在那里输入来安装人性化的包 - pip install humanfriendly

代码:

from humanfriendly import format_timespan
import time
begin_time = time.time()
# Put your code here
end_time = time.time() - begin_time
print("Total execution time: ", format_timespan(end_time))
Run Code Online (Sandbox Code Playgroud)

输出:

在此处输入图片说明


Alf*_*fie 5

有一个timeit模块可用于计算python代码的执行时间.它在python文档中有详细的文档和示例(https://docs.python.org/2/library/timeit.html)


Gal*_*all 5

我也喜欢Paul McGuire的答案,并提出了一个适合我更多需求的上下文管理器表单.

import datetime as dt
import timeit

class TimingManager(object):
    """Context Manager used with the statement 'with' to time some execution.

    Example:

    with TimingManager() as t:
       # Code to time
    """

    clock = timeit.default_timer

    def __enter__(self):
        """
        """
        self.start = self.clock()
        self.log('\n=> Start Timing: {}')

        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        """
        """
        self.endlog()

        return False

    def log(self, s, elapsed=None):
        """Log current time and elapsed time if present.
        :param s: Text to display, use '{}' to format the text with
            the current time.
        :param elapsed: Elapsed time to display. Dafault: None, no display.
        """
        print s.format(self._secondsToStr(self.clock()))

        if(elapsed is not None):
            print 'Elapsed time: {}\n'.format(elapsed)

    def endlog(self):
        """Log time for the end of execution with elapsed time.
        """
        self.log('=> End Timing: {}', self.now())

    def now(self):
        """Return current elapsed time as hh:mm:ss string.
        :return: String.
        """
        return str(dt.timedelta(seconds = self.clock() - self.start))

    def _secondsToStr(self, sec):
        """Convert timestamp to h:mm:ss string.
        :param sec: Timestamp.
        """
        return str(dt.datetime.fromtimestamp(sec))
Run Code Online (Sandbox Code Playgroud)


Yu *_*aao 5

使用line_profiler

line_profiler将分析各个代码行执行所需的时间。剖析器通过Cython在C中实现,以减少分析的开销。

from line_profiler import LineProfiler
import random

def do_stuff(numbers):
    s = sum(numbers)
    l = [numbers[i]/43 for i in range(len(numbers))]
    m = ['hello'+str(numbers[i]) for i in range(len(numbers))]

numbers = [random.randint(1,100) for i in range(1000)]
lp = LineProfiler()
lp_wrapper = lp(do_stuff)
lp_wrapper(numbers)
lp.print_stats()
Run Code Online (Sandbox Code Playgroud)

结果将是:

Timer unit: 1e-06 s

Total time: 0.000649 s
File: <ipython-input-2-2e060b054fea>
Function: do_stuff at line 4

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     4                                           def do_stuff(numbers):
     5         1           10     10.0      1.5      s = sum(numbers)
     6         1          186    186.0     28.7      l = [numbers[i]/43 for i in range(len(numbers))]
     7         1          453    453.0     69.8      m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
Run Code Online (Sandbox Code Playgroud)


小智 5

您只需在 Python 中执行此操作。没有必要让它变得复杂。

import time

start = time.localtime()
end = time.localtime()
"""Total execution time in minutes$ """
print(end.tm_min - start.tm_min)
"""Total execution time in seconds$ """
print(end.tm_sec - start.tm_sec)
Run Code Online (Sandbox Code Playgroud)


Nik*_*kur 5

对于函数,我建议使用我创建的这个简单的装饰器。

def timeit(method):
    def timed(*args, **kwargs):
        ts = time.time()
        result = method(*args, **kwargs)
        te = time.time()
        if 'log_time' in kwargs:
            name = kwargs.get('log_name', method.__name__.upper())
            kwargs['log_time'][name] = int((te - ts) * 1000)
        else:
            print('%r  %2.22f ms' % (method.__name__, (te - ts) * 1000))
        return result
    return timed

@timeit
def foo():
    do_some_work()

# foo()
# 'foo'  0.000953 ms
Run Code Online (Sandbox Code Playgroud)


Ale*_*lex 5

遵循这个答案创建了一个简单但方便的仪器。

import time
from datetime import timedelta

def start_time_measure(message=None):
    if message:
        print(message)
    return time.monotonic()

def end_time_measure(start_time, print_prefix=None):
    end_time = time.monotonic()
    if print_prefix:
        print(print_prefix + str(timedelta(seconds=end_time - start_time)))
    return end_time
Run Code Online (Sandbox Code Playgroud)

用法:

total_start_time = start_time_measure()    
start_time = start_time_measure('Doing something...')
# Do something
end_time_measure(start_time, 'Done in: ')
start_time = start_time_measure('Doing something else...')
# Do something else
end_time_measure(start_time, 'Done in: ')
end_time_measure(total_start_time, 'Total time: ')
Run Code Online (Sandbox Code Playgroud)

输出:

Doing something...
Done in: 0:00:01.218000
Doing something else...
Done in: 0:00:01.313000
Total time: 0:00:02.672000
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

943966 次

最近记录:

6 年,2 月 前