Kiểm tra tốc độ Python - Chênh lệch thời gian - mili giây


136

Cách thích hợp để so sánh 2 lần trong Python để tăng tốc độ kiểm tra một phần của mã là gì? Tôi đã thử đọc các tài liệu API. Tôi không chắc là tôi hiểu điều timedelta.

Cho đến nay tôi có mã này:

from datetime import datetime

tstart = datetime.now()
print t1

# code to speed test

tend = datetime.now()
print t2
# what am I missing?
# I'd like to print the time diff here

15
Tại sao bạn không in t2-t1? Điều gì ngăn bạn trừ đi?
S.Lott

18
Đoán xem, tôi đã có khoảnh khắc "không thể dễ dàng như vậy".
BuddyJoe

Câu trả lời:


190

datetime.timedelta chỉ là sự khác biệt giữa hai thời gian ... vì vậy nó giống như một khoảng thời gian, tính bằng ngày / giây / micro giây

>>> import datetime
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> c = b - a

>>> c
datetime.timedelta(0, 4, 316543)
>>> c.days
0
>>> c.seconds
4
>>> c.microseconds
316543

Xin lưu ý rằng c.microsecondschỉ trả về phần micro giây của timedelta! Đối với mục đích thời gian luôn luôn sử dụng c.total_seconds().

Bạn có thể thực hiện tất cả các loại toán học với datetime.timedelta, vd:

>>> c / 10
datetime.timedelta(0, 0, 431654)

Có thể hữu ích hơn khi xem xét thời gian của CPU thay vì thời gian đồng hồ mặc dù ... đó là phụ thuộc vào hệ điều hành mặc dù ... trong các hệ thống giống như Unix, hãy kiểm tra lệnh 'thời gian'.


Bất cứ ai quan tâm đến việc có được tổng số phút có thể sử dụng int(c.total_seconds() / 60)trong trường hợp này
sufinawaz 6/2/2015

2
Các trang cho các mô-đun timeit nói rằng các mô-đun "tránh một số bẫy phổ biến để đo thời gian thực hiện." Cách tiếp cận này (sử dụng datetime.now) có phải chịu bất kỳ cạm bẫy nào không?
kuzzooroo

@kuzzooroo vâng, đúng vậy! Sẽ tốt hơn nếu sử dụng timeit thay vì phương pháp này! Ví dụ, tôi có một thử nghiệm trong một dự án python lớn, khi được đo bằng phương pháp này sẽ dẫn đến thời gian chạy được cho là 0,25 giây. Trong thực tế, và theo thời gian, thời gian chạy của chức năng nói thực sự là 30 giây!
kazaamjt

62

Vì Python 2.7 có phương thức timedelta.total_seconds (). Vì vậy, để có được một phần nghìn giây trôi qua:

>>> import datetime
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> delta = b - a
>>> print delta
0:00:05.077263
>>> int(delta.total_seconds() * 1000) # milliseconds
5077


20

Bạn cũng có thể sử dụng:

import time

start = time.clock()
do_something()
end = time.clock()
print "%.2gs" % (end-start)

Hoặc bạn có thể sử dụng các hồ sơ python .


1
Khi sử dụng start = time.clock()nó in 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.
Contango

16

Tôi biết điều này là muộn, nhưng tôi thực sự thích sử dụng:

import time
start = time.time()

##### your timed code here ... #####

print "Process time: " + (time.time() - start)

time.time()cung cấp cho bạn giây kể từ kỷ nguyên. Vì đây là thời gian chuẩn hóa tính bằng giây, bạn chỉ cần trừ thời gian bắt đầu từ thời gian kết thúc để có được thời gian xử lý (tính bằng giây). time.clock()là tốt cho điểm chuẩn, nhưng tôi đã thấy nó vô dụng nếu bạn muốn biết quá trình của bạn mất bao lâu. Ví dụ: nói "quá trình của tôi mất 10 giây" trực quan hơn nhiều so với nói "quá trình của tôi mất 10 đơn vị đồng hồ bộ xử lý"

>>> start = time.time(); sum([each**8.3 for each in range(1,100000)]) ; print (time.time() - start)
3.4001404476250935e+45
0.0637760162354
>>> start = time.clock(); sum([each**8.3 for each in range(1,100000)]) ; print (time.clock() - start)
3.4001404476250935e+45
0.05

Trong ví dụ đầu tiên ở trên, bạn được hiển thị thời gian 0,05 cho time.clock () so với 0,06377 cho time.time ()

>>> start = time.clock(); time.sleep(1) ; print "process time: " + (time.clock() - start)
process time: 0.0
>>> start = time.time(); time.sleep(1) ; print "process time: " + (time.time() - start)
process time: 1.00111794472

Trong ví dụ thứ hai, bằng cách nào đó thời gian của bộ xử lý hiển thị "0" mặc dù quá trình này đã ngủ trong một giây. time.time()hiển thị chính xác hơn 1 giây một chút.


TênError: tên 'thời gian' không được xác định
Joe

Bạn cần import timetuyên bố
mgoldwasser

5

Đoạn mã sau sẽ hiển thị thời gian ...

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

4

Bạn chỉ có thể in sự khác biệt:

print tend - tstart

4

Tôi không phải là lập trình viên Python, nhưng tôi biết cách sử dụng Google và đây là những gì tôi tìm thấy: bạn sử dụng toán tử "-". Để hoàn thành mã của bạn:

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

Ngoài ra, có vẻ như bạn có thể sử dụng hàm strftime () để định dạng phép tính thời gian để hiển thị thời gian tuy nhiên khiến bạn hài lòng.


xem bình luận thứ hai ở cấp độ câu hỏi.
BuddyJoe

14
"nhưng tôi biết cách sử dụng Google" - mặc dù vậy, rõ ràng, bạn không biết cách sử dụng Stack Overflow, vì toàn bộ mục đích của trang web này là để mọi người hỏi và trả lời chính xác các câu hỏi lập trình để đưa ra ý kiến ​​về việc "bạn có thể đã Goggled nó thay thế".
Hejazzman

2

time.time () / datetime rất tốt để sử dụng nhanh, nhưng không phải lúc nào cũng chính xác 100%. Vì lý do đó, tôi thích sử dụng một trong những trình mô tả lib std (đặc biệt là ảnh nóng) để tìm hiểu xem cái gì.


2

Bạn có thể muốn xem xét các mô-đun hồ sơ . Bạn sẽ hiểu rõ hơn về sự chậm chạp của bạn và phần lớn công việc của bạn sẽ được tự động hóa hoàn toàn.


2

Đây là một chức năng tùy chỉnh bắt chước các chức năng của Matlab / Octave tic toc.

Ví dụ sử dụng:

time_var = time_me(); # get a variable with the current timestamp

... run operation ...

time_me(time_var); # print the time difference (e.g. '5 seconds 821.12314 ms')

Chức năng :

def time_me(*arg):
    if len(arg) != 0: 
        elapsedTime = time.time() - arg[0];
        #print(elapsedTime);
        hours = math.floor(elapsedTime / (60*60))
        elapsedTime = elapsedTime - hours * (60*60);
        minutes = math.floor(elapsedTime / 60)
        elapsedTime = elapsedTime - minutes * (60);
        seconds = math.floor(elapsedTime);
        elapsedTime = elapsedTime - seconds;
        ms = elapsedTime * 1000;
        if(hours != 0):
            print ("%d hours %d minutes %d seconds" % (hours, minutes, seconds)) 
        elif(minutes != 0):
            print ("%d minutes %d seconds" % (minutes, seconds))
        else :
            print ("%d seconds %f ms" % (seconds, ms))
    else:
        #print ('does not exist. here you go.');
        return time.time()

TracBack (cuộc gọi gần đây nhất vừa qua): Tệp "redis-get-response.py", dòng 22, trong <module> time_var = time_me (); # nhận một biến với dấu thời gian hiện tại Tệp "redis-get-response.py", dòng 20, trong time_me return time.time () NameError: tên 'time' không được xác định
Joe

0

Bạn có thể sử dụng timeit như thế này để kiểm tra tập lệnh có tên module.py

$ python -mtimeit -s 'import module'

0

Mũi tên: Ngày và giờ tốt hơn cho Python

import arrow
start_time = arrow.utcnow()
end_time = arrow.utcnow()
(end_time - start_time).total_seconds()  # senconds
(end_time - start_time).total_seconds() * 1000  # milliseconds
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.