Hẹn giờ dừng trong Python

Trong phần còn lại của bài viết này, chúng ta sẽ mở rộng khái niệm này bằng cách tính toán và báo cáo thời gian thực hiện của hàm

Đánh dấu một thời điểm. Mô-đun thời gian Python

Mô-đun

10.004060745239258

Learn Data Science with

6 được trang bị nhiều phương pháp để báo cáo GMT hoặc giờ địa phương được định dạng độc đáo theo năm, tháng, ngày, giờ, phút và giây

Đối với mục đích tính thời gian của chúng tôi, sẽ rất hữu ích nếu thời gian được biểu thị dưới dạng một số duy nhất. Chúng tôi đã đạt được điều này trong mã giới thiệu, nhưng đây là kết quả mà hàm

10.004060745239258

Learn Data Science with

8 thực sự tạo ra

current_time = time.time()

print(current_time)

Learn Data Science with

Ngoài

1659543906.2127182

Learn Data Science with

Số được in trên màn hình biểu thị thời gian chỉ tính bằng giây đã trôi qua kể từ một số kỷ nguyên phụ thuộc vào hệ thống (hầu hết các hệ thống sử dụng ngày 1 tháng 1 năm 1970), bị loại bỏ khỏi bất kỳ cấu trúc nào khác

Vì chúng tôi có thời gian giảm xuống một số dấu phẩy động, chúng tôi chỉ có thể trừ một điểm thời gian cho điểm kia

Hãy đưa ví dụ của chúng tôi trở lại từ phần giới thiệu

start_time = time.time()

time.sleep(10)

end_time = time.time()
elapsed_time = end_time - start_time

print(elapsed_time)

Learn Data Science with

Ngoài

10.007065773010254

Learn Data Science with

Ở đây, chúng tôi đã sử dụng

10.004060745239258

Learn Data Science with

9 để tạm dừng thực thi trong mười giây. Chúng tôi đã đánh dấu thời gian trước và sau
current_time = time.time()

print(current_time)

Learn Data Science with

0, tính toán thời gian đã trôi qua và in nó ra

Kết quả là hơn mười giây một chút và là một con số hơi khác ở mỗi lần thực hiện. Điều này là do thời gian phụ thuộc vào các hoạt động khác của hệ thống—hệ thống chạy các hoạt động ngẫu nhiên ở giữa, khiến chúng tôi mất hơn mười giây

Các lựa chọn thay thế tốt hơn cho time()

Vì chúng tôi đã thiết lập sơ bộ cách tính thời gian đã trôi qua, chúng tôi có thể tinh chỉnh mã của mình một chút. Mô-đun thời gian của Python cung cấp cho chúng ta các lựa chọn thay thế cho hàm

10.004060745239258

Learn Data Science with

8, tất cả đều báo cáo thời gian tính bằng giây nhưng theo các cách khác nhau

10.004060745239258

Learn Data Science with

8 chúng tôi đã sử dụng cho đến bây giờ báo cáo thời gian trên đồng hồ treo tường của hệ thống. Chúng tôi cũng có một chức năng tên là
current_time = time.time()

print(current_time)

Learn Data Science with

3 theo ý của chúng tôi. Chức năng này sử dụng đồng hồ đơn điệu không thể quay ngược hoặc bị ảnh hưởng bởi các bản cập nhật đồng hồ hệ thống

Nếu chúng tôi dự định đo lường một quy trình dài hạn, chúng tôi sẽ chọn

current_time = time.time()

print(current_time)

Learn Data Science with

3 vì tính toàn vẹn của nó, nhưng chúng tôi sẽ đo lường các quy trình đơn giản tại đây

Python cung cấp cho chúng tôi quyền truy cập vào bộ đếm hiệu suất để đo thời gian ngắn, được gọi là

current_time = time.time()

print(current_time)

Learn Data Science with

5, sử dụng đồng hồ hệ thống có độ phân giải cao nhất. Tiếp tục, chúng tôi sẽ sử dụng
current_time = time.time()

print(current_time)

Learn Data Science with

5 trong tính toán của mình

Bộ hẹn giờ sử dụng trình quản lý ngữ cảnh

Trình quản lý bối cảnh cho phép chúng tôi gói logic bằng mã thiết lập và chia nhỏ bổ sung, cho phép chúng tôi quản lý tài nguyên một cách hiệu quả. Vì chúng tôi dự định bao quanh mã bằng logic thời gian, trình quản lý bối cảnh là một sự phù hợp hoàn hảo

Trước tiên chúng ta hãy xem một ví dụ đơn giản về trình quản lý bối cảnh để hiểu rõ hơn về cấu trúc và cách sử dụng của nó

from contextlib import contextmanager

@contextmanager
def demonstrate_cm():
    print('Anything before yield is executed at the very beginning')
    yield
    print('Anything after yield is executed at the very end')


with demonstrate_cm():
    for n in range(10):
      print(n, end="\n")

Learn Data Science with

Ngoài

Anything before yield is executed at the very beginning
0
1
2
3
4
5
6
7
8
9
Anything after yield is executed at the very end

Learn Data Science with

Ở đây,

current_time = time.time()

print(current_time)

Learn Data Science with

7 được triển khai dưới dạng trình quản lý ngữ cảnh bằng cách sử dụng trình trang trí
current_time = time.time()

print(current_time)

Learn Data Science with

8. Từ khóa
current_time = time.time()

print(current_time)

Learn Data Science with

9 chia thân hàm thành hai phần. 1) Các biểu thức trên
current_time = time.time()

print(current_time)

Learn Data Science with

9 được thực thi ngay trước đoạn mã được quản lý 2) Các biểu thức dưới đây
current_time = time.time()

print(current_time)

Learn Data Science with

9 được thực thi ngay sau

Sau khi được xác định, chúng tôi đính kèm

current_time = time.time()

print(current_time)

Learn Data Science with

7 vào một khối mã bằng cách sử dụng câu lệnh
1659543906.2127182

Learn Data Science with

3

Trong phần tiếp theo, chúng ta sẽ sử dụng cấu trúc tương tự để tạo bộ đếm thời gian

Xác định trình quản lý bối cảnh hẹn giờ

Trình quản lý ngữ cảnh hẹn giờ bên dưới rất giống với trình quản lý ngữ cảnh ở trên, ngoại trừ bây giờ chúng ta đang bao quanh

current_time = time.time()

print(current_time)

Learn Data Science with

9 bằng logic thời gian của mình

@contextmanager
def timer():
    t0 = time.perf_counter()
    try:
        yield
    finally:
        t1 = time.perf_counter()
        elapsed = t1 - t0
        print(f'{elapsed:0.4f}')

Learn Data Science with

Hãy nhanh chóng xem xét mã này

Đầu tiên, lưu ý rằng chúng tôi đã đặt

current_time = time.time()

print(current_time)

Learn Data Science with

9 trong một khối
1659543906.2127182

Learn Data Science with

6 để đảm bảo khối mã được đóng khung sẽ không ảnh hưởng đến công việc của trình quản lý ngữ cảnh. Nếu mã được quản lý tạo ra lỗi, bộ đếm thời gian sẽ vẫn báo cáo thời gian đã trôi qua cho đến khi xảy ra lỗi

Trên

1659543906.2127182

Learn Data Science with

6, chúng tôi đã đánh dấu điểm bắt đầu. các
1659543906.2127182

Learn Data Science with

8. Trong vòng
1659543906.2127182

Learn Data Science with

9, chúng tôi đã đánh dấu điểm cuối và tính toán thời gian đã trôi qua. Cuối cùng, chúng tôi đã giới hạn biểu diễn của
start_time = time.time()

time.sleep(10)

end_time = time.time()
elapsed_time = end_time - start_time

print(elapsed_time)

Learn Data Science with

0 ở bốn điểm thập phân thông qua chuỗi f và in nó ra

Hãy đưa nó vào sử dụng

# Using the timer like a regular context manager 
with timer():
  for i in range(1000000):
    i -= 1 
        
# Using the timer as a decorator
@timer()
def example(num):
    time.sleep(num)

     
example(5)

Learn Data Science with

Ngoài

10.004060745239258

Learn Data Science with

0

Một lợi thế của việc sử dụng bộ trang trí

current_time = time.time()

print(current_time)

Learn Data Science with

8 để xác định bộ đếm thời gian của chúng ta là chúng ta có thể sử dụng bộ đếm thời gian bằng cách sử dụng cả câu lệnh
1659543906.2127182

Learn Data Science with

3 và như một bộ trang trí chức năng, như trong ví dụ trước. Nếu chúng ta muốn tính thời gian cho một hoạt động nhất định một lần, chúng ta có thể gọi vào
start_time = time.time()

time.sleep(10)

end_time = time.time()
elapsed_time = end_time - start_time

print(elapsed_time)

Learn Data Science with

3 bằng cách sử dụng câu lệnh
1659543906.2127182

Learn Data Science with

3. Tuy nhiên, nếu chúng ta muốn theo dõi thời gian chạy của hàm trong mỗi lần thực hiện, chúng ta có thể trang trí hàm bằng cách sử dụng
start_time = time.time()

time.sleep(10)

end_time = time.time()
elapsed_time = end_time - start_time

print(elapsed_time)

Learn Data Science with

5

Điều gì xảy ra nếu chúng ta muốn chuyển đối số cho trình quản lý bối cảnh của mình?

Tham số hóa bộ hẹn giờ

Chúng tôi đã quản lý để lập trình bộ hẹn giờ có thể áp dụng cho bất kỳ chức năng nào. Nó gọn gàng và di động. Tuy nhiên, chúng ta vẫn có thể tiến thêm một bước và thêm một số tính linh hoạt cho nó

Trong khối mã sau, chúng tôi đã tạo một phiên bản được tham số hóa của bộ hẹn giờ, được gọi là

start_time = time.time()

time.sleep(10)

end_time = time.time()
elapsed_time = end_time - start_time

print(elapsed_time)

Learn Data Science with

6. Chúng tôi đã loại bỏ các phương thức truy cập và báo cáo thời gian được mã hóa cứng và cho phép tham số
start_time = time.time()

time.sleep(10)

end_time = time.time()
elapsed_time = end_time - start_time

print(elapsed_time)

Learn Data Science with

7 định dạng chuỗi thông báo

10.004060745239258

Learn Data Science with

1

Ngoài

10.004060745239258

Learn Data Science with

2

Bên trong câu lệnh

1659543906.2127182

Learn Data Science with

3, chúng tôi đã thông qua hai đối số. (1) sử dụng chức năng hẹn giờ và thông báo tùy chỉnh cho chức năng in. Vì chúng tôi đang sử dụng
start_time = time.time()

time.sleep(10)

end_time = time.time()
elapsed_time = end_time - start_time

print(elapsed_time)

Learn Data Science with

9 làm chức năng định thời gian nên chúng tôi sẽ đo thời gian của CPU, không bao gồm thời gian dành cho việc ngủ

Trong phần tiếp theo, chúng ta sẽ làm việc thông qua việc chuyển đổi bộ đếm thời gian thành bộ trang trí, giúp dễ dàng áp dụng các khả năng tính thời gian cho các chức năng của chúng ta

Định nghĩa một Timer Decorator

Chúng tôi cũng có thể định nghĩa bộ đếm thời gian của mình là một công cụ trang trí hoàn hảo. Chúng tôi sẽ thiết kế triển khai bộ hẹn giờ này để ghi lại thời gian chạy trung bình cho một chức năng nhất định

Trong mã bên dưới, chúng tôi đang tạo một trình trang trí tiêu chuẩn lấy chức năng được trang trí làm tham số của nó. Bộ đếm thời gian lồng nhau về cơ bản giống như bộ hẹn giờ trước mà chúng tôi đã tạo

10.004060745239258

Learn Data Science with

3

Mã bộ hẹn giờ gần giống với bộ hẹn giờ trước, nhưng giờ đây chúng tôi đã thêm hai biến để theo dõi thời gian.

10.007065773010254

Learn Data Science with

0 và
10.007065773010254

Learn Data Science with

1. Các giá trị này sẽ tích lũy và giữ các giá trị cần thiết để tính giá trị trung bình

Bây giờ, chúng tôi sẽ áp dụng trình trang trí này cho một chức năng mà chúng tôi muốn tính thời gian

10.004060745239258

Learn Data Science with

4

Ngoài

10.004060745239258

Learn Data Science with

5

Khi chúng tôi trang trí

10.007065773010254

Learn Data Science with

2 với
10.007065773010254

Learn Data Science with

3, đó là cách viết tắt của
10.007065773010254

Learn Data Science with

4, che đi định nghĩa ban đầu của
10.007065773010254

Learn Data Science with

2 để cung cấp chức năng bổ sung từ trình trang trí. Lưu ý rằng
10.007065773010254

Learn Data Science with

6 chỉ chạy một lần—nó thay thế
10.007065773010254

Learn Data Science with

7 và công việc của nó đã hoàn thành

start_time = time.time()

time.sleep(10)

end_time = time.time()
elapsed_time = end_time - start_time

print(elapsed_time)

Learn Data Science with

3 được trả về từ
10.007065773010254

Learn Data Science with

6

  1. Tiếp nhận
    from contextlib import contextmanager
    
    @contextmanager
    def demonstrate_cm():
        print('Anything before yield is executed at the very beginning')
        yield
        print('Anything after yield is executed at the very end')
    
    
    with demonstrate_cm():
        for n in range(10):
          print(n, end="\n")

    Learn Data Science with

    0—những điều này đại diện cho các lập luận
    from contextlib import contextmanager
    
    @contextmanager
    def demonstrate_cm():
        print('Anything before yield is executed at the very beginning')
        yield
        print('Anything after yield is executed at the very end')
    
    
    with demonstrate_cm():
        for n in range(10):
          print(n, end="\n")

    Learn Data Science with

    1 có thể có hoặc không
  2. Ghi lại thời gian là
    1659543906.2127182

    Learn Data Science with

    8
  3. Thực hiện
    from contextlib import contextmanager
    
    @contextmanager
    def demonstrate_cm():
        print('Anything before yield is executed at the very beginning')
        yield
        print('Anything after yield is executed at the very end')
    
    
    with demonstrate_cm():
        for n in range(10):
          print(n, end="\n")

    Learn Data Science with

    1 với
    from contextlib import contextmanager
    
    @contextmanager
    def demonstrate_cm():
        print('Anything before yield is executed at the very beginning')
        yield
        print('Anything after yield is executed at the very end')
    
    
    with demonstrate_cm():
        for n in range(10):
          print(n, end="\n")

    Learn Data Science with

    0 và lưu kết quả
  4. Đo thời gian đã trôi qua kể từ ngày
    1659543906.2127182

    Learn Data Science with

    8
  5. Tiếp cận phạm vi cha với
    from contextlib import contextmanager
    
    @contextmanager
    def demonstrate_cm():
        print('Anything before yield is executed at the very beginning')
        yield
        print('Anything after yield is executed at the very end')
    
    
    with demonstrate_cm():
        for n in range(10):
          print(n, end="\n")

    Learn Data Science with

    6 để lấy các biến
    10.007065773010254

    Learn Data Science with

    0 và
    10.007065773010254

    Learn Data Science with

    1. Từ khóa
    from contextlib import contextmanager
    
    @contextmanager
    def demonstrate_cm():
        print('Anything before yield is executed at the very beginning')
        yield
        print('Anything after yield is executed at the very end')
    
    
    with demonstrate_cm():
        for n in range(10):
          print(n, end="\n")

    Learn Data Science with

    6 thông báo rằng
    start_time = time.time()
    
    time.sleep(10)
    
    end_time = time.time()
    elapsed_time = end_time - start_time
    
    print(elapsed_time)

    Learn Data Science with

    3 không tạo ra giá trị mới ở đây mà đang vươn ra để lấy những giá trị không phải của địa phương
  6. Thêm một vào
    10.007065773010254

    Learn Data Science with

    1, thêm thời gian đã trôi qua vào
    10.007065773010254

    Learn Data Science with

    0
  7. In thời gian đã trôi qua -
    start_time = time.time()
    
    time.sleep(10)
    
    end_time = time.time()
    elapsed_time = end_time - start_time
    
    print(elapsed_time)

    Learn Data Science with

    0
  8. In thời gian chạy trung bình -
    Anything before yield is executed at the very beginning
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Anything after yield is executed at the very end

    Learn Data Science with

    4
  9. Trả lại kết quả từ
    from contextlib import contextmanager
    
    @contextmanager
    def demonstrate_cm():
        print('Anything before yield is executed at the very beginning')
        yield
        print('Anything after yield is executed at the very end')
    
    
    with demonstrate_cm():
        for n in range(10):
          print(n, end="\n")

    Learn Data Science with

    1 cho người gọi

Nhìn chung, đây là một mẫu hữu ích để tính thời gian cho các chức năng khác nhau trong mã của bạn;

Bản tóm tắt

Việc đo thời gian trôi qua bên trong một chương trình có thể được thực hiện bằng cách gọi

Anything before yield is executed at the very beginning
0
1
2
3
4
5
6
7
8
9
Anything after yield is executed at the very end

Learn Data Science with

6 hai lần, một lần ở đầu và một lần ở cuối. Sự khác biệt trong các giá trị trả về sau đó sẽ tiết lộ thời gian thực hiện

Chức năng này có thể được lập trình thành trình quản lý bối cảnh, cho phép chúng tôi đo thời gian thực hiện của bất kỳ khối mã nào bằng cách sử dụng câu lệnh

1659543906.2127182

Learn Data Science with

3. Chúng ta cũng có thể triển khai nó bằng cách sử dụng một trình trang trí và đưa các lệnh gọi đo thời gian vào chức năng được trang trí