Làm cách nào để đo thời gian thực hiện giữa các dòng mã trong python?


98

Vì vậy, trong Java, chúng ta có thể thực hiện Cách đo thời gian do một hàm thực thi

Nhưng nó được thực hiện như thế nào trong python? Để đo thời gian bắt đầu và thời gian kết thúc giữa các dòng mã? Một cái gì đó thực hiện điều này:

import some_time_library

starttime = some_time_library.some_module()
code_tobe_measured() 
endtime = some_time_library.some_module()

time_taken = endtime - starttime

Câu trả lời:


150

Nếu bạn muốn đo thời gian CPU, có thể sử dụng time.process_time()cho Python 3.3 trở lên:

import time
start = time.process_time()
# your code here    
print(time.process_time() - start)

Cuộc gọi đầu tiên bật bộ hẹn giờ và cuộc gọi thứ hai cho bạn biết bao nhiêu giây đã trôi qua.

Ngoài ra còn có một hàm time.clock(), nhưng nó không được dùng nữa kể từ Python 3.3 và sẽ bị loại bỏ trong Python 3.8.

Có những công cụ cấu hình tốt hơn như timeitprofile, tuy nhiên time.process_time () sẽ đo thời gian CPU và đây là những gì bạn đang hỏi.

Nếu bạn muốn đo thời gian trên đồng hồ treo tường, hãy sử dụng time.time().


52
Đây không phải là cách bạn sử dụng time.clock()time.clock()đo thời gian CPU trên Unix mà là thời gian tường trên Windows. Tốt hơn là sử dụng time.time()ở nơi hành vi không thay đổi theo hệ điều hành. stackoverflow.com/questions/85451/…
Tim

4
Chúc bạn quan sát tốt, @Tim. Tuy nhiên, một bài đăng khác về câu hỏi tương tự đã trích dẫn python doc trên time.clock () rằng "đây là hàm được sử dụng để đánh giá điểm chuẩn của Python hoặc các thuật toán thời gian". Tôi đoán nó đi đến câu hỏi về những gì bạn thực sự muốn đo lường.
Yevgen Yampolskiy

1
Một điều rất xấu về time.time () là nó bị ảnh hưởng bởi thời gian sunchronization ntpdate vv Tôi sẽ nói time.clock () sẽ là lựa chọn duy nhất đáng tin cậy vì điều này
www.jensolsson.se

4
DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead
ismailarilik

2
Hmmm ... không chắc mình đang làm gì sai. Tôi đã thay thế # your code herebằng time.sleep(10)và có 0,0 giây. Thêm vào for i in range(10000):/passtạo ra kết quả tương tự. Trong bất kỳ trường hợp nào tôi đã thử, time.process_time()luôn trả về cùng một số. Tôi đã nhận được kết quả mong đợi bằng cách sử dụng time.perf_counter()mặc dù
biscuit314

56

Bạn cũng có thể sử dụng timethư viện:

import time

start = time.time()

# your code

# end

print(f'Time: {time.time() - start}')

1
@Hayat - Phương thức này trả về thời gian dưới dạng số dấu phẩy động được biểu thị bằng giây kể từ kỷ nguyên, tính bằng UTC. [
docs.python.org/3/library/time.html

@AnumoySutradhar thực sự không phải vậy, vì nó trừ đi một kỷ nguyên so với một kỷ nguyên, bạn sẽ có chênh lệch múi giờ giữa hai thời điểm.
Nasta

28

Với sự trợ giúp của một lớp tiện lợi nhỏ, bạn có thể đo thời gian dành cho các dòng thụt lề như sau:

with CodeTimer():
   line_to_measure()
   another_line()
   # etc...

Dòng nào sẽ hiển thị thông tin sau sau khi (các) dòng thụt lề kết thúc thực thi:

Code block took: x.xxx ms

CẬP NHẬT: Bây giờ bạn có thể tải lớp học với pip install linetimervà sau đó from linetimer import CodeTimer. Xem dự án GitHub này .

Mã cho lớp trên:

import timeit

class CodeTimer:
    def __init__(self, name=None):
        self.name = " '"  + name + "'" if name else ''

    def __enter__(self):
        self.start = timeit.default_timer()

    def __exit__(self, exc_type, exc_value, traceback):
        self.took = (timeit.default_timer() - self.start) * 1000.0
        print('Code block' + self.name + ' took: ' + str(self.took) + ' ms')

Sau đó, bạn có thể đặt tên cho các khối mã mà bạn muốn đo lường:

with CodeTimer('loop 1'):
   for i in range(100000):
      pass

with CodeTimer('loop 2'):
   for i in range(100000):
      pass

Code block 'loop 1' took: 4.991 ms
Code block 'loop 2' took: 3.666 ms

lồng chúng:

with CodeTimer('Outer'):
   for i in range(100000):
      pass

   with CodeTimer('Inner'):
      for i in range(100000):
         pass

   for i in range(100000):
      pass

Code block 'Inner' took: 2.382 ms
Code block 'Outer' took: 10.466 ms

Về việc timeit.default_timer(), nó sử dụng bộ đếm thời gian tốt nhất dựa trên phiên bản hệ điều hành và Python, hãy xem câu trả lời này .


10

Tôi luôn thích kiểm tra thời gian ở định dạng giờ, phút và giây (% H:% M:% S):

from datetime import datetime
start = datetime.now()
# your code
end = datetime.now()
time_taken = end - start
print('Time: ',time_taken) 

đầu ra:

Time:  0:00:00.000019

3

Tôi đang tìm cách xuất thời gian được định dạng với mã tối thiểu, vì vậy đây là giải pháp của tôi. Nhiều người vẫn sử dụng Pandas, vì vậy trong một số trường hợp, điều này có thể tiết kiệm từ các lần nhập thư viện bổ sung.

import pandas as pd
start = pd.Timestamp.now()
# code
print(pd.Timestamp.now()-start)

Đầu ra:

0 days 00:05:32.541600

Tôi khuyên bạn nên sử dụng điều này nếu độ chính xác thời gian không phải là quan trọng nhất, nếu không, hãy sử dụng timethư viện:

%timeit pd.Timestamp.now() đầu ra 3,29 µs ± 214 ns mỗi vòng lặp

%timeit time.time() đầu ra 154 ns ± 13,3 ns mỗi vòng lặp


1

Bạn cũng có thể thử điều này:

from time import perf_counter

t0 = perf_counter()

...

t1 = perf_counter()
time_taken = t1 - t0

1

Đưa mã vào một hàm, sau đó sử dụng trình trang trí để định thời gian là một lựa chọn khác. ( Nguồn ) Ưu điểm của phương pháp này là bạn xác định bộ đếm thời gian một lần và sử dụng nó với một dòng bổ sung đơn giản cho mọi chức năng.

Đầu tiên, xác định trình timertrang trí:

import functools
import time

def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        value = func(*args, **kwargs)
        end_time = time.perf_counter()
        run_time = end_time - start_time
        print("Finished {} in {} secs".format(repr(func.__name__), round(run_time, 3)))
        return value

    return wrapper

Sau đó, sử dụng trình trang trí trong khi xác định hàm:

@timer
def doubled_and_add(num):
    res = sum([i*2 for i in range(num)])
    print("Result : {}".format(res))

Hãy thử:

doubled_and_add(100000)
doubled_and_add(1000000)

Đầu ra:

Result : 9999900000
Finished 'doubled_and_add' in 0.0119 secs
Result : 999999000000
Finished 'doubled_and_add' in 0.0897 secs

Lưu ý: Tôi không chắc tại sao phải sử dụng time.perf_counterthay thế time.time. Bình luận được hoan nghênh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.