2008-10-01 37 views
40

Tôi chỉ đang cố gắng viết một đoạn mã. Mã giả trông giống như:Nhận các dấu hẹn giờ trong Python

start = get_ticks() 
do_long_code() 
print "It took " + (get_ticks() - start) + " seconds." 

Điều này trông như thế nào trong Python?

Cụ thể hơn, làm thế nào để tôi nhận được số lượng bọ ve kể từ nửa đêm (hoặc tuy nhiên Python tổ chức thời gian đó)?

+0

liên quan: [Đo thời gian trôi qua bằng Python?] (Http://stackoverflow.com/q/7370801/4279) – jfs

Trả lời

33

Trong mô-đun time, có hai chức năng thời gian: timeclock. time cho bạn thời gian "tường", nếu đây là điều bạn quan tâm.

Tuy nhiên, trăn docs nói rằng clock nên được sử dụng để đo điểm chuẩn. Lưu ý rằng clock cư xử khác nhau trong hệ thống riêng biệt:

  • trên MS Windows, nó sử dụng hàm Win32 QueryPerformanceCounter(), với "độ phân giải thường tốt hơn so với một micro giây". Nó không có ý nghĩa đặc biệt, nó chỉ là một con số (nó bắt đầu đếm lần đầu tiên bạn gọi clock trong quá trình của bạn).
 
    # ms windows 
    t0= time.clock() 
    do_something() 
    t= time.clock() - t0 # t is wall seconds elapsed (floating point) 
  • trên * nix, clock báo cáo thời gian CPU. Bây giờ, điều này là khác nhau, và có lẽ là giá trị bạn muốn, vì chương trình của bạn hầu như không bao giờ là quá trình duy nhất yêu cầu thời gian CPU (ngay cả khi bạn không có các tiến trình khác, hạt nhân sử dụng thời gian CPU bây giờ và sau đó). Vì vậy, con số này, mà thường là smaller¹ hơn thời gian tường (tức time.time() - t0), có ý nghĩa hơn khi điểm chuẩn mã:
 
    # linux 
    t0= time.clock() 
    do_something() 
    t= time.clock() - t0 # t is CPU seconds elapsed (floating point) 

Ngoài tất cả những gì, module timeitTimer lớp được cho là sử dụng những gì tốt nhất cho điểm chuẩn từ các chức năng có sẵn.

¹ trừ khi luồng được theo cách này ...

² Python ≥3.3: có time.perf_counter() and time.process_time(). perf_counter đang được sử dụng bởi mô-đun timeit.

+0

'time.clock()' có thể có độ chính xác kém trên * nix. [Sử dụng 'timeit.default_timer'] (http://stackoverflow.com/a/25823885/4279), để có được bộ đếm thời gian tốt nhất để đo hiệu suất thời gian trên các phiên bản hệ điều hành và Python khác nhau. – jfs

30

gì bạn cần là time() chức năng từ time mô-đun:

import time 
start = time.time() 
do_long_code() 
print "it took", time.time() - start, "seconds." 

Bạn có thể sử dụng timeit mô-đun cho các tùy chọn nhiều hơn mặc dù.

2
import datetime 

start = datetime.datetime.now() 
do_long_code() 
finish = datetime.datetime.now() 
delta = finish - start 
print delta.seconds 

Từ nửa đêm:

import datetime 

midnight = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) 
now = datetime.datetime.now() 
delta = now - midnight 
print delta.seconds 
+0

Điều này không tính cho ngày đã qua trong ngày giờ (và về mặt kỹ thuật micro giây, nhưng vì chúng tôi không quan tâm đến những ...), vì vậy sẽ rất không chính xác nếu mã dài mất nhiều thời gian hơn bạn nghĩ. – leetNightshade

2

Các time module trong python cung cấp cho bạn truy cập vào các đồng hồ() chức năng, mà trả về thời gian trong vài giây như là một điểm nổi.

Hệ thống khác nhau sẽ có độ chính xác khác nhau dựa trên thiết lập đồng hồ bên trong (bọ ve mỗi giây) nhưng thường ít nhất là dưới 20mili giây và trong một số trường hợp tốt hơn vài micro giây.

-Adam

4

Dưới đây là một giải pháp mà tôi bắt đầu sử dụng thời gian gần đây:

class Timer: 
    def __enter__(self): 
     self.begin = now() 

    def __exit__(self, type, value, traceback): 
     print(format_delta(self.begin, now())) 

Bạn sử dụng nó như thế này (Bạn cần ít nhất Python 2.5):

with Timer(): 
    do_long_code() 

Khi mã của bạn kết thúc, hẹn giờ tự động in ra thời gian chạy. Ngọt! Nếu tôi đang cố gắng sắp xếp một cách nhanh chóng thứ gì đó trong Python Interpreter, đây là cách dễ nhất để đi.

Và đây là triển khai mẫu 'hiện tại' và 'format_delta', mặc dù bạn có thể thoải mái sử dụng phương pháp định dạng và thời gian ưa thích của mình.

import datetime 

def now(): 
    return datetime.datetime.now() 

# Prints one of the following formats*: 
# 1.58 days 
# 2.98 hours 
# 9.28 minutes # Not actually added yet, oops. 
# 5.60 seconds 
# 790 milliseconds 
# *Except I prefer abbreviated formats, so I print d,h,m,s, or ms. 
def format_delta(start,end): 

    # Time in microseconds 
    one_day = 86400000000 
    one_hour = 3600000000 
    one_second = 1000000 
    one_millisecond = 1000 

    delta = end - start 

    build_time_us = delta.microseconds + delta.seconds * one_second + delta.days * one_day 

    days = 0 
    while build_time_us > one_day: 
     build_time_us -= one_day 
     days += 1 

    if days > 0: 
     time_str = "%.2fd" % (days + build_time_us/float(one_day)) 
    else: 
     hours = 0 
     while build_time_us > one_hour: 
      build_time_us -= one_hour 
      hours += 1 
     if hours > 0: 
      time_str = "%.2fh" % (hours + build_time_us/float(one_hour)) 
     else: 
      seconds = 0 
      while build_time_us > one_second: 
       build_time_us -= one_second 
       seconds += 1 
      if seconds > 0: 
       time_str = "%.2fs" % (seconds + build_time_us/float(one_second)) 
      else: 
       ms = 0 
       while build_time_us > one_millisecond: 
        build_time_us -= one_millisecond 
        ms += 1 
       time_str = "%.2fms" % (ms + build_time_us/float(one_millisecond)) 
    return time_str 

Vui lòng cho tôi biết nếu bạn có phương pháp định dạng ưa thích hoặc nếu có cách dễ dàng hơn để thực hiện tất cả điều này!

0

Nếu bạn có nhiều báo cáo bạn muốn thời gian, bạn có thể sử dụng một cái gì đó như thế này:

class Ticker: 
    def __init__(self): 
     self.t = clock() 

    def __call__(self): 
     dt = clock() - self.t 
     self.t = clock() 
     return 1000 * dt 

Sau đó, mã của bạn có thể trông giống như:

tick = Ticker() 
# first command 
print('first took {}ms'.format(tick()) 
# second group of commands 
print('second took {}ms'.format(tick()) 
# third group of commands 
print('third took {}ms'.format(tick()) 

Bằng cách đó bạn không cần phải nhập t = time() trước mỗi khối và 1000 * (time() - t) sau khi chặn, trong khi vẫn giữ quyền kiểm soát định dạng (mặc dù bạn cũng có thể dễ dàng đặt định dạng đó trong Ticket).

Đó là mức tăng tối thiểu, nhưng tôi nghĩ nó thuận tiện.