Hướng dẫn can you make a timer in python? - bạn có thể hẹn giờ trong python không?
Cải thiện bài viết Show
Lưu bài viết Cải thiện bài viết Lưu bài viết Đọc Bàn luậnTrong bài viết này, chúng ta sẽ xem cách tạo bộ đếm thời gian đếm ngược bằng Python. Mã sẽ lấy đầu vào từ người dùng về độ dài của đếm ngược tính bằng giây. Sau đó, việc đếm ngược sẽ bắt đầu trên màn hình của định dạng ‘phút: giây. Chúng tôi sẽ sử dụng mô -đun thời gian ở đây. sleep() function. Follow the below steps to create a countdown timer:
Bước 9: Bây giờ thời gian giảm để vòng lặp trong khi có thể hội tụ. Python3Bước 10: Sau khi hoàn thành vòng lặp, chúng tôi sẽ in lửa trong lỗ hổng để biểu thị sự kết thúc của đếm ngược. Dưới đây là việc thực hiện phương pháp trên 0 1 2 3 4 5 6 7 12 13 9 15 03 7 8 9 00 01 022 7 05 9 07 08 09 10 4 12 28 29 03 7 18 19 03 37 38 39Output: https://media.geeksforgeeks.org/wp-content/cdn-uploads/20200729151851/python-countdown-timer.webm Trong khi nhiều nhà phát triển nhận ra Python là ngôn ngữ lập trình hiệu quả, các chương trình Python thuần túy có thể chạy chậm hơn so với các đối tác của họ trong các ngôn ngữ được biên dịch như C, Rust và Java. Trong hướng dẫn này, bạn sẽ học cách sử dụng bộ hẹn giờ Python để theo dõi mức độ nhanh chóng của các chương trình của bạn.Python timer to monitor how quickly your programs are running. Trong hướng dẫn này, bạn sẽ học cách sử dụng:
Bạn cũng sẽ có được kiến thức nền về cách các lớp học, người quản lý bối cảnh và người trang trí hoạt động. Khi bạn khám phá các ví dụ về từng khái niệm, bạn sẽ được truyền cảm hứng để sử dụng một hoặc một vài trong số chúng trong mã của bạn, để thực hiện mã thời gian, cũng như trong các ứng dụng khác. Mỗi phương pháp có những ưu điểm của nó và bạn sẽ học được cách sử dụng tùy thuộc vào tình huống. Thêm vào đó, bạn sẽ có một bộ đếm thời gian python hoạt động mà bạn có thể sử dụng để theo dõi các chương trình của mình! Đồng hồ hẹn giờĐầu tiên, bạn sẽ xem xét một số mã ví dụ mà bạn sẽ sử dụng trong suốt hướng dẫn. Sau đó, bạn sẽ thêm một bộ đếm thời gian python vào mã này để theo dõi hiệu suất của nó. Bạn cũng sẽ học một số cách đơn giản nhất để đo thời gian chạy của ví dụ này.Python timer to this code to monitor its performance. You’ll also learn some of the simplest ways to measure the running time of this example. Chức năng hẹn giờ PythonNếu bạn kiểm tra mô-đun 1 tích hợp trong Python, thì bạn sẽ nhận thấy một số chức năng có thể đo thời gian:
Python 3.7 đã giới thiệu một số chức năng mới, như 46, cũng như các phiên bản nano giây của tất cả các chức năng ở trên, được đặt tên với hậu tố 47. Ví dụ: 48 là phiên bản nano giây của 43. Bạn sẽ tìm hiểu thêm về các chức năng này sau này. Hiện tại, lưu ý những gì tài liệu phải nói về 43:nanosecond versions of all the functions above, named with an 47 suffix. For example,
48 is the nanosecond version of 43. You’ll learn more about these functions later. For now, note what the documentation has to say about 43:
Đầu tiên, bạn sẽ sử dụng 43 để tạo bộ hẹn giờ Python. Sau đó, bạn sẽ so sánh điều này với các chức năng hẹn giờ Python khác và tìm hiểu lý do tại sao 43 thường là lựa chọn tốt nhất.Ví dụ: Tải xuống hướng dẫnĐể so sánh tốt hơn các cách khác nhau mà bạn có thể thêm bộ hẹn giờ Python vào mã của mình, bạn sẽ áp dụng các chức năng hẹn giờ Python khác nhau vào cùng một ví dụ về mã trong suốt hướng dẫn này. Nếu bạn đã có mã mà bạn muốn đo, thì hãy tự do làm theo các ví dụ với điều đó. Ví dụ mà bạn sẽ sử dụng trong hướng dẫn này là một hàm ngắn sử dụng gói 53 để tải xuống các hướng dẫn mới nhất có sẵn tại đây trên Real Python. Để tìm hiểu thêm về đầu đọc Python thực sự và cách thức hoạt động, hãy xem cách xuất bản gói Python nguồn mở lên PYPI. Bạn có thể cài đặt 53 trên hệ thống của mình với 55:
Sau đó, bạn có thể nhập gói dưới dạng 56.Bạn sẽ lưu trữ ví dụ trong một tệp có tên 57. Mã này bao gồm một chức năng tải xuống và in hướng dẫn mới nhất từ Real Python:
53 xử lý hầu hết các công việc khó khăn:
Khi bạn chạy ví dụ này, đầu ra của bạn thường sẽ trông giống như thế này:
Mã có thể mất một chút thời gian để chạy tùy thuộc vào mạng của bạn, vì vậy bạn có thể muốn sử dụng bộ hẹn giờ Python để theo dõi hiệu suất của tập lệnh. Bộ đếm thời gian Python đầu tiên của bạnBây giờ, bạn sẽ thêm một bộ đếm thời gian trăn trần vào ví dụ với 40. Một lần nữa, đây là một bộ đếm hiệu suất phù hợp với các phần thời gian của mã của bạn.performance counter that’s well-suited for timing parts of your code. 43 đo thời gian tính bằng vài giây từ một số thời điểm không xác định, điều đó có nghĩa là giá trị trả lại của một cuộc gọi cho chức năng không hữu ích. Tuy nhiên, khi bạn nhìn vào sự khác biệt giữa hai cuộc gọi đến 43, bạn có thể tìm ra bao nhiêu giây trôi qua giữa hai cuộc gọi:>>>
Trong ví dụ này, bạn đã thực hiện hai cuộc gọi đến 43 cách nhau gần 4 giây. Bạn có thể xác nhận điều này bằng cách tính toán chênh lệch giữa hai đầu ra: 32315.26 - 32311,49 = 3,77.Bây giờ bạn có thể thêm bộ hẹn giờ Python vào mã ví dụ:
Lưu ý rằng bạn gọi 43 cả trước và sau khi tải xuống hướng dẫn. Sau đó, bạn in thời gian để tải xuống hướng dẫn bằng cách tính toán sự khác biệt giữa hai cuộc gọi.Bây giờ, khi bạn chạy ví dụ, bạn sẽ thấy thời gian trôi qua trước hướng dẫn:
Đó là nó! Bạn đã đề cập đến những điều cơ bản về thời gian của mã Python của riêng bạn. Trong phần còn lại của hướng dẫn, bạn sẽ tìm hiểu làm thế nào bạn có thể bọc một bộ đếm thời gian python vào một lớp học, một người quản lý bối cảnh và một người trang trí để làm cho nó phù hợp và thuận tiện hơn để sử dụng. Lớp học hẹn giờ PythonNhìn lại cách bạn đã thêm bộ hẹn giờ python vào ví dụ trên. Lưu ý rằng bạn cần ít nhất một biến ( 70) để lưu trữ trạng thái của bộ hẹn giờ Python trước khi bạn tải xuống hướng dẫn. Sau khi nghiên cứu mã một chút, bạn cũng có thể lưu ý rằng ba dòng được tô sáng chỉ được thêm vào cho mục đích thời gian! Bây giờ, bạn sẽ tạo ra một lớp giống như các cuộc gọi hướng dẫn của bạn đến 43, nhưng theo cách dễ đọc và nhất quán hơn.Trong suốt hướng dẫn này, bạn sẽ tạo và cập nhật 72, một lớp mà bạn có thể sử dụng để thời gian mã của mình theo nhiều cách khác nhau. Mã cuối cùng với một số tính năng bổ sung cũng có sẵn trên PYPI dưới tên 73. Bạn có thể cài đặt nó trên hệ thống của mình như vậy:
Bạn có thể tìm thêm thông tin về 73 sau này trong hướng dẫn này, trong phần có tên là mã hẹn giờ Python.
Hiểu các lớp học trong PythonCác lớp là các khối xây dựng chính của lập trình hướng đối tượng. Một lớp về cơ bản là một mẫu mà bạn có thể sử dụng để tạo các đối tượng. Trong khi Python không buộc bạn lập trình theo cách hướng đối tượng, các lớp học ở khắp mọi nơi trong ngôn ngữ. Để có bằng chứng nhanh, điều tra mô -đun 1 module:>>>
Trong ví dụ này, bạn đã thực hiện hai cuộc gọi đến 43 cách nhau gần 4 giây. Bạn có thể xác nhận điều này bằng cách tính toán chênh lệch giữa hai đầu ra: 32315.26 - 32311,49 = 3,77.>>>
Trong ví dụ này, bạn đã thực hiện hai cuộc gọi đến 43 cách nhau gần 4 giây. Bạn có thể xác nhận điều này bằng cách tính toán chênh lệch giữa hai đầu ra: 32315.26 - 32311,49 = 3,77.attributes, and behaviors, called methods. For more background on classes and object-oriented programming,
check out Object-Oriented Programming (OOP) in Python 3 or the official docs.Tạo lớp hẹn giờ PythonCác lớp học tốt cho trạng thái theo dõi. Trong một lớp 72, bạn muốn theo dõi thời điểm hẹn giờ bắt đầu và thời gian trôi qua kể từ đó. Đối với lần thực hiện đầu tiên của 72, bạn sẽ thêm thuộc tính 81, cũng như các phương thức 82 và 83. Thêm mã sau vào tệp có tên 84:state. In a 72 class, you want to keep track of when a timer starts and how much time has passed since then. For the first implementation of 72, you’ll add a 81 attribute, as well as 82 and 83 methods. Add the following code to a file named 84:
Một vài điều khác nhau đang xảy ra ở đây, vì vậy hãy dành một chút thời gian để đi qua mã từng bước. Trong dòng 5, bạn xác định một lớp 85. Ký hiệu 86 có nghĩa là 85 kế thừa từ một lớp khác được gọi là 88. Python sử dụng lớp tích hợp này để xử lý lỗi. Bạn không cần thêm bất kỳ thuộc tính hoặc phương thức nào vào 85, nhưng có lỗi tùy chỉnh sẽ cho bạn linh hoạt hơn để xử lý các vấn đề bên trong 72. Để biết thêm thông tin, hãy xem các ngoại lệ Python: Giới thiệu.inherits from another class called 88. Python uses this built-in class for error handling. You don’t need to add any attributes or methods to 85, but having a custom error will give you more flexibility to handle problems inside 72. For more information, check out Python Exceptions: An Introduction.Định nghĩa của 72 tự bắt đầu trên dòng 8. Khi bạn lần đầu tiên tạo hoặc khởi tạo một đối tượng từ một lớp, mã của bạn gọi phương thức đặc biệt 92. Trong phiên bản đầu tiên của 72, bạn chỉ khởi tạo thuộc tính 81 mà bạn sẽ sử dụng để theo dõi trạng thái của bộ đếm thời gian Python của mình. Nó có giá trị 95 khi bộ đếm thời gian chạy. Khi bộ hẹn giờ đang chạy, 81 theo dõi khi bộ hẹn giờ bắt đầu.instantiate an object from a class, your code calls the special method 92. In this first version of 72, you only initialize the 81 attribute, which you’ll use to track the state of your Python timer. It has the value 95 when the timer isn’t running. Once the timer is running, 81 keeps track of when the timer started.Khi bạn gọi 82 để bắt đầu bộ đếm thời gian Python mới, trước tiên bạn sẽ kiểm tra xem bộ đếm thời gian có đang chạy không. Sau đó, bạn lưu trữ giá trị hiện tại là 43 trong 81.Mặt khác, khi bạn gọi 83, trước tiên bạn kiểm tra xem bộ đếm thời gian Python có đang chạy không. Nếu có, thì bạn tính thời gian trôi qua là chênh lệch giữa giá trị hiện tại của 43 và giá trị mà bạn lưu trữ trong 81. Cuối cùng, bạn đặt lại 81 để bộ hẹn giờ có thể được khởi động lại và in thời gian trôi qua.Đây là cách bạn sử dụng 72:>>> 0
So sánh điều này với ví dụ trước đó mà bạn đã sử dụng trực tiếp 43. Cấu trúc của mã khá giống nhau, nhưng bây giờ mã rõ ràng hơn và đây là một trong những lợi ích của việc sử dụng các lớp. Bằng cách chọn cẩn thận lớp, phương thức và tên thuộc tính của bạn, bạn có thể làm cho mã của mình rất mô tả!Sử dụng lớp hẹn giờ PythonBây giờ áp dụng 72 cho 57. Bạn chỉ cần thực hiện một vài thay đổi đối với mã trước đó của mình: 1Lưu ý rằng mã rất giống với những gì bạn đã sử dụng trước đó. Ngoài việc làm cho mã dễ đọc hơn, 72 còn chăm sóc việc in thời gian trôi qua vào bảng điều khiển, điều này làm cho việc ghi lại thời gian dành cho sự nhất quán hơn. Khi bạn chạy mã, bạn sẽ nhận được khá nhiều đầu ra: 2In thời gian trôi qua từ 72 có thể phù hợp, nhưng có vẻ như phương pháp này không linh hoạt lắm. Trong phần tiếp theo, bạn sẽ thấy cách tùy chỉnh lớp học của mình.Thêm sự tiện lợi và linh hoạt hơnCho đến nay, bạn đã học được rằng các lớp phù hợp khi bạn muốn gói gọn trạng thái và đảm bảo hành vi nhất quán trong mã của bạn. Trong phần này, bạn sẽ thêm sự tiện lợi và linh hoạt hơn vào bộ đếm thời gian Python của bạn:
Đầu tiên, xem cách bạn có thể tùy chỉnh văn bản được sử dụng để báo cáo thời gian dành. Trong mã trước, văn bản 10 được mã hóa cứng thành 83. Bạn có thể thêm tính linh hoạt cho các lớp bằng các biến thể hiện, có giá trị thường được truyền dưới dạng đối số cho 92 và được lưu trữ dưới dạng các thuộc tính 13. Để thuận tiện, bạn cũng có thể cung cấp các giá trị mặc định hợp lý.instance variables, whose values are normally passed as arguments to 92 and stored as 13 attributes. For convenience, you can also provide reasonable default values.Để thêm 14 dưới dạng biến thể hiện 72, bạn sẽ làm một cái gì đó như thế này trong 84: 3Lưu ý rằng văn bản mặc định, 17, được đưa ra dưới dạng chuỗi thông thường, không phải là chuỗi F. Bạn có thể sử dụng một chuỗi F ở đây vì F-Strings đánh giá ngay lập tức và khi bạn khởi tạo 72, mã của bạn vẫn chưa tính toán thời gian trôi qua.Trong 83, bạn sử dụng 14 làm mẫu và 21 để điền vào mẫu: 4Sau bản cập nhật này lên 84, bạn có thể thay đổi văn bản như sau:>>> 5So sánh điều này với ví dụ trước đó mà bạn đã sử dụng trực tiếp 43. Cấu trúc của mã khá giống nhau, nhưng bây giờ mã rõ ràng hơn và đây là một trong những lợi ích của việc sử dụng các lớp. Bằng cách chọn cẩn thận lớp, phương thức và tên thuộc tính của bạn, bạn có thể làm cho mã của mình rất mô tả!Có lẽ bạn muốn tích hợp 72 vào các thói quen ghi nhật ký của mình. Để hỗ trợ ghi nhật ký hoặc đầu ra khác từ 72, bạn cần thay đổi cuộc gọi thành 27 để người dùng có thể cung cấp chức năng ghi nhật ký của riêng họ. Điều này có thể được thực hiện tương tự như cách bạn tùy chỉnh văn bản trước đó: 6Thay vì sử dụng trực tiếp 27, bạn tạo một biến thể hiện khác trong dòng 13, 29, sẽ đề cập đến một hàm lấy một chuỗi làm đối số. Ngoài 27, bạn có thể sử dụng các chức năng như 31 hoặc 32 trên các đối tượng tệp. Cũng lưu ý thử nghiệm 33 trong dòng 25, cho phép bạn tắt in hoàn toàn bằng cách vượt qua 34.Dưới đây là hai ví dụ cho thấy chức năng mới trong hành động: >>> 7Khi bạn chạy các ví dụ này trong một shell tương tác, Python sẽ tự động in giá trị trả về. Cải tiến thứ ba mà bạn sẽ thêm là khả năng tích lũy các phép đo thời gian. Bạn có thể muốn làm điều này, ví dụ, khi bạn gọi một hàm chậm trong một vòng lặp. Bạn sẽ thêm một chút chức năng dưới dạng bộ hẹn giờ được đặt tên với một từ điển theo dõi mọi bộ đếm thời gian python trong mã của bạn.time measurements. You may want to do this, for example, when you’re calling a slow function in a loop. You’ll add a bit more functionality in the form of named timers with a dictionary that keeps track of every Python timer in your code. Giả sử rằng bạn đang mở rộng 57 sang tập lệnh 36 tải xuống và in mười hướng dẫn mới nhất từ Real Python. Sau đây là một triển khai có thể: 8Mã vòng lặp qua các số từ 0 đến 9 và sử dụng các đối số bù làm đối số cho 37. Khi bạn chạy tập lệnh, bạn sẽ in rất nhiều thông tin vào bảng điều khiển của mình: 9Một vấn đề tinh tế với mã này là bạn đã đo lường không chỉ thời gian để tải xuống các hướng dẫn, mà cả thời gian Python dành cho việc in các hướng dẫn lên màn hình của bạn. Điều này có thể không quan trọng vì thời gian in ấn nên không đáng kể so với thời gian tải xuống. Tuy nhiên, sẽ rất tốt nếu có một cách chính xác thời gian mà bạn đã làm sau trong những tình huống này. Có một số cách mà bạn có thể làm việc xung quanh điều này mà không thay đổi việc triển khai 38 hiện tại, tuy nhiên, việc hỗ trợ trường hợp sử dụng này sẽ khá hữu ích và bạn có thể làm điều đó chỉ với một vài dòng mã.Đầu tiên, bạn sẽ giới thiệu một từ điển gọi là 39 như một biến lớp trên 72, điều đó có nghĩa là tất cả các trường hợp của 72 sẽ chia sẻ nó. Bạn thực hiện nó bằng cách xác định nó bên ngoài bất kỳ phương pháp nào:class variable on 72, which means that all instances of 72 will share it. You implement it by defining it outside any methods:Các biến lớp có thể được truy cập trực tiếp trên lớp hoặc thông qua một phiên bản của lớp: >>> 0Khi bạn chạy các ví dụ này trong một shell tương tác, Python sẽ tự động in giá trị trả về. Cải tiến thứ ba mà bạn sẽ thêm là khả năng tích lũy các phép đo thời gian. Bạn có thể muốn làm điều này, ví dụ, khi bạn gọi một hàm chậm trong một vòng lặp. Bạn sẽ thêm một chút chức năng dưới dạng bộ hẹn giờ được đặt tên với một từ điển theo dõi mọi bộ đếm thời gian python trong mã của bạn.
Một vấn đề tinh tế với mã này là bạn đã đo lường không chỉ thời gian để tải xuống các hướng dẫn, mà cả thời gian Python dành cho việc in các hướng dẫn lên màn hình của bạn. Điều này có thể không quan trọng vì thời gian in ấn nên không đáng kể so với thời gian tải xuống. Tuy nhiên, sẽ rất tốt nếu có một cách chính xác thời gian mà bạn đã làm sau trong những tình huống này. 1Có một số cách mà bạn có thể làm việc xung quanh điều này mà không thay đổi việc triển khai 38 hiện tại, tuy nhiên, việc hỗ trợ trường hợp sử dụng này sẽ khá hữu ích và bạn có thể làm điều đó chỉ với một vài dòng mã.>>> 2Khi bạn chạy các ví dụ này trong một shell tương tác, Python sẽ tự động in giá trị trả về. 3Cải tiến thứ ba mà bạn sẽ thêm là khả năng tích lũy các phép đo thời gian. Bạn có thể muốn làm điều này, ví dụ, khi bạn gọi một hàm chậm trong một vòng lặp. Bạn sẽ thêm một chút chức năng dưới dạng bộ hẹn giờ được đặt tên với một từ điển theo dõi mọi bộ đếm thời gian python trong mã của bạn. 4Giả sử rằng bạn đang mở rộng 57 sang tập lệnh 36 tải xuống và in mười hướng dẫn mới nhất từ Real Python. Sau đây là một triển khai có thể:>>> 5Khi bạn chạy các ví dụ này trong một shell tương tác, Python sẽ tự động in giá trị trả về. Cải tiến thứ ba mà bạn sẽ thêm là khả năng tích lũy các phép đo thời gian. Bạn có thể muốn làm điều này, ví dụ, khi bạn gọi một hàm chậm trong một vòng lặp. Bạn sẽ thêm một chút chức năng dưới dạng bộ hẹn giờ được đặt tên với một từ điển theo dõi mọi bộ đếm thời gian python trong mã của bạn. Giả sử rằng bạn đang mở rộng 57 sang tập lệnh 36 tải xuống và in mười hướng dẫn mới nhất từ Real Python. Sau đây là một triển khai có thể: 6Mã vòng lặp qua các số từ 0 đến 9 và sử dụng các đối số bù làm đối số cho 37. Khi bạn chạy tập lệnh, bạn sẽ in rất nhiều thông tin vào bảng điều khiển của mình:Bạn cần chú thích các biến của mình để sử dụng lớp dữ liệu. Bạn có thể sử dụng chú thích này để thêm gợi ý loại vào mã của bạn. Nếu bạn không muốn sử dụng các gợi ý loại, thì thay vào đó bạn có thể chú thích tất cả các biến bằng 58, giống như bạn đã làm ở trên. Bạn sẽ sớm học cách thêm gợi ý loại thực tế vào lớp dữ liệu của bạn.Dưới đây là một vài ghi chú về lớp dữ liệu 72:
Lớp dữ liệu 72 mới của bạn hoạt động giống như lớp thông thường trước đây của bạn, ngoại trừ bây giờ nó có một đại diện tốt đẹp:>>> 7Bây giờ bạn có một phiên bản khá gọn gàng của 72 mà nhất quán, linh hoạt, thuận tiện và nhiều thông tin! Bạn có thể áp dụng nhiều cải tiến mà bạn đã thực hiện trong phần này cho các loại lớp khác trong các dự án của bạn.Trước khi kết thúc phần này, hãy xem lại mã nguồn đầy đủ của 72 như hiện tại. Bạn sẽ nhận thấy việc bổ sung các gợi ý loại vào mã để thêm tài liệu: 8Sử dụng một lớp để tạo bộ hẹn giờ Python có một số lợi ích:
Lớp này rất linh hoạt và bạn có thể sử dụng nó trong hầu hết mọi tình huống mà bạn muốn theo dõi thời gian cần thiết để chạy. Tuy nhiên, trong các phần tiếp theo, bạn sẽ tìm hiểu về việc sử dụng các trình quản lý và trang trí ngữ cảnh, sẽ thuận tiện hơn cho các khối và chức năng mã thời gian. Trình quản lý bối cảnh hẹn giờ PythonLớp Python 72 của bạn đã đi một chặng đường dài! So với bộ hẹn giờ Python đầu tiên bạn tạo, mã của bạn đã trở nên khá mạnh mẽ. Tuy nhiên, vẫn còn một chút mã nồi hơi cần thiết để sử dụng 72 của bạn:
May mắn thay, Python có một cấu trúc độc đáo để gọi các chức năng trước và sau một khối mã: Trình quản lý bối cảnh. Trong phần này, bạn sẽ tìm hiểu những gì các nhà quản lý bối cảnh và câu lệnh Python từ ____283 là và cách bạn có thể tạo của riêng mình. Sau đó, bạn sẽ mở rộng 72 để nó có thể hoạt động như một người quản lý bối cảnh. Cuối cùng, bạn sẽ thấy cách sử dụng 72 làm trình quản lý ngữ cảnh có thể đơn giản hóa mã của bạn.context manager. In this section, you’ll learn what context managers and Python’s 83 statement are, and how you can create your own. Then you’ll expand 72 so that it can
work as a context manager as well. Finally, you’ll see how using 72 as a context manager can simplify your code.Hiểu các nhà quản lý bối cảnh trong PythonCác nhà quản lý bối cảnh đã là một phần của Python trong một thời gian dài. Chúng được giới thiệu bởi PEP 343 vào năm 2005 và lần đầu tiên được thực hiện trong Python 2.5. Bạn có thể nhận ra các trình quản lý ngữ cảnh trong mã bằng cách sử dụng từ khóa 83: 83 keyword: 9 87 là một số biểu thức Python trả về Trình quản lý ngữ cảnh. Trình quản lý bối cảnh tùy chọn bị ràng buộc với tên 88. Cuối cùng, 89 là bất kỳ khối mã Python thông thường nào. Trình quản lý bối cảnh sẽ đảm bảo rằng chương trình của bạn gọi một số mã trước 89 và một số mã khác sau khi 89 thực thi. Cái sau sẽ xảy ra, ngay cả khi 89 làm tăng một ngoại lệ.Việc sử dụng phổ biến nhất của các nhà quản lý bối cảnh có lẽ là xử lý các tài nguyên khác nhau, như các tệp, khóa và kết nối cơ sở dữ liệu. Trình quản lý bối cảnh sau đó được sử dụng để miễn phí và làm sạch tài nguyên sau khi bạn đã sử dụng nó. Ví dụ sau đây cho thấy cấu trúc cơ bản của 84 bằng cách chỉ in các dòng có chứa ruột. Quan trọng hơn, nó hiển thị thành ngữ phổ biến để mở một tệp trong Python:>>> 0Bây giờ bạn có một phiên bản khá gọn gàng của 72 mà nhất quán, linh hoạt, thuận tiện và nhiều thông tin! Bạn có thể áp dụng nhiều cải tiến mà bạn đã thực hiện trong phần này cho các loại lớp khác trong các dự án của bạn.Trước khi kết thúc phần này, hãy xem lại mã nguồn đầy đủ của 72 như hiện tại. Bạn sẽ nhận thấy việc bổ sung các gợi ý loại vào mã để thêm tài liệu:Điều đó có nghĩa là 94 là người quản lý bối cảnh? Về mặt kỹ thuật, nó có nghĩa là 94 thực hiện giao thức Trình quản lý bối cảnh. Có nhiều giao thức khác nhau làm cơ sở cho ngôn ngữ Python. Bạn có thể nghĩ về một giao thức như một hợp đồng nêu rõ các phương thức cụ thể của bạn phải thực hiện.context manager protocol. There are many different protocols underlying the Python language.
You can think of a protocol as a contract that states what specific methods your code must implement.Giao thức Trình quản lý bối cảnh bao gồm hai phương pháp:
Nói cách khác, để tự tạo một người quản lý bối cảnh, bạn cần viết một lớp thực hiện 03 và 04. Không nhiều không ít. Hãy thử một lời chào, thế giới! Ví dụ về Trình quản lý bối cảnh: 1 07 là người quản lý bối cảnh vì nó thực hiện giao thức Trình quản lý ngữ cảnh. Bạn có thể sử dụng nó như thế này:>>> 2Đầu tiên, lưu ý cách 03 được gọi trước khi bạn làm công cụ, trong khi 04 được gọi sau. Trong ví dụ đơn giản hóa này, bạn không tham khảo Trình quản lý ngữ cảnh. Trong những trường hợp như vậy, bạn không cần phải đặt tên cho người quản lý bối cảnh với 10.Tiếp theo, hãy chú ý cách 03 trả về 13. Giá trị trả về của 03 bị ràng buộc bởi 10. Bạn thường muốn trả lại 13 từ 03 khi tạo người quản lý ngữ cảnh. Bạn có thể sử dụng giá trị trả về đó như sau:>>> 3Đầu tiên, lưu ý cách 03 được gọi trước khi bạn làm công cụ, trong khi 04 được gọi sau. Trong ví dụ đơn giản hóa này, bạn không tham khảo Trình quản lý ngữ cảnh. Trong những trường hợp như vậy, bạn không cần phải đặt tên cho người quản lý bối cảnh với 10.Tiếp theo, hãy chú ý cách 03 trả về 13. Giá trị trả về của 03 bị ràng buộc bởi 10. Bạn thường muốn trả lại 13 từ 03 khi tạo người quản lý ngữ cảnh. Bạn có thể sử dụng giá trị trả về đó như sau:>>> 4Đầu tiên, lưu ý cách 03 được gọi trước khi bạn làm công cụ, trong khi 04 được gọi sau. Trong ví dụ đơn giản hóa này, bạn không tham khảo Trình quản lý ngữ cảnh. Trong những trường hợp như vậy, bạn không cần phải đặt tên cho người quản lý bối cảnh với 10.Tiếp theo, hãy chú ý cách 03 trả về 13. Giá trị trả về của 03 bị ràng buộc bởi 10. Bạn thường muốn trả lại 13 từ 03 khi tạo người quản lý ngữ cảnh. Bạn có thể sử dụng giá trị trả về đó như sau:Cuối cùng, >>> import time >>> time.perf_counter() 32311.48899951 >>> time.perf_counter() # A few seconds later 32315.261320793 04 có ba đối số: >>> import time >>> time.perf_counter() 32311.48899951 >>> time.perf_counter() # A few seconds later 32315.261320793 18, >>> import time >>> time.perf_counter() 32311.48899951 >>> time.perf_counter() # A few seconds later 32315.261320793 19 và >>> import time >>> time.perf_counter() 32311.48899951 >>> time.perf_counter() # A few seconds later 32315.261320793 20. Chúng được sử dụng để xử lý lỗi trong trình quản lý ngữ cảnh và chúng phản ánh các giá trị trả về của >>> import time >>> time.perf_counter() 32311.48899951 >>> time.perf_counter() # A few seconds later 32315.261320793 21.Nếu một ngoại lệ xảy ra trong khi khối đang được thực thi, thì mã của bạn sẽ gọi 04 với loại ngoại lệ, một thể hiện ngoại lệ và đối tượng TraceBack. Thông thường, bạn có thể bỏ qua những điều này trong trình quản lý bối cảnh của mình, trong trường hợp đó 04 được gọi trước khi ngoại lệ được đọc lại:Bạn có thể thấy rằng 24 được in, mặc dù có một lỗi trong mã. 5Bây giờ bạn đã biết những người quản lý bối cảnh là gì và làm thế nào bạn có thể tạo ra của riêng bạn. Nếu bạn muốn lặn sâu hơn, thì hãy xem 25 trong thư viện tiêu chuẩn. Nó bao gồm các cách thuận tiện để xác định các nhà quản lý bối cảnh mới, cũng như các nhà quản lý bối cảnh làm sẵn mà bạn có thể sử dụng để đóng các đối tượng, triệt tiêu lỗi hoặc thậm chí không làm gì cả! Để biết thêm thông tin, hãy xem các nhà quản lý bối cảnh và câu lệnh Python từ ____283.>>> 6Đầu tiên, lưu ý cách 03 được gọi trước khi bạn làm công cụ, trong khi 04 được gọi sau. Trong ví dụ đơn giản hóa này, bạn không tham khảo Trình quản lý ngữ cảnh. Trong những trường hợp như vậy, bạn không cần phải đặt tên cho người quản lý bối cảnh với 10.
Nếu một ngoại lệ xảy ra trong khi khối đang được thực thi, thì mã của bạn sẽ gọi 04 với loại ngoại lệ, một thể hiện ngoại lệ và đối tượng TraceBack. Thông thường, bạn có thể bỏ qua những điều này trong trình quản lý bối cảnh của mình, trong trường hợp đó 04 được gọi trước khi ngoại lệ được đọc lại:>>> 7Đầu tiên, lưu ý cách 03 được gọi trước khi bạn làm công cụ, trong khi 04 được gọi sau. Trong ví dụ đơn giản hóa này, bạn không tham khảo Trình quản lý ngữ cảnh. Trong những trường hợp như vậy, bạn không cần phải đặt tên cho người quản lý bối cảnh với 10.Tiếp theo, hãy chú ý cách >>> import time >>> time.perf_counter() 32311.48899951 >>> time.perf_counter() # A few seconds later 32315.261320793 03 trả về $ python latest_tutorial.py # Python Timer Functions: Three Ways to Monitor Your Code While many developers recognize Python as an effective programming language, pure Python programs may run more slowly than their counterparts in compiled languages like C, Rust, and Java. In this tutorial, you'll learn how to use a Python timer to monitor how quickly your programs are running. [ ... ] ## Read the full article at https://realpython.com/python-timer/ » * * * 13. Giá trị trả về của >>> import time >>> time.perf_counter() 32311.48899951 >>> time.perf_counter() # A few seconds later 32315.261320793 03 bị ràng buộc bởi >>> import time >>> time.perf_counter() 32311.48899951 >>> time.perf_counter() # A few seconds later 32315.261320793 10. Bạn thường muốn trả lại $ python latest_tutorial.py # Python Timer Functions: Three Ways to Monitor Your Code While many developers recognize Python as an effective programming language, pure Python programs may run more slowly than their counterparts in compiled languages like C, Rust, and Java. In this tutorial, you'll learn how to use a Python timer to monitor how quickly your programs are running. [ ... ] ## Read the full article at https://realpython.com/python-timer/ » * * * 13 từ >>> import time >>> time.perf_counter() 32311.48899951 >>> time.perf_counter() # A few seconds later 32315.261320793 03 khi tạo người quản lý ngữ cảnh. Bạn có thể sử dụng giá trị trả về đó như sau:Cuối cùng, 04 có ba đối số: 18, 19 và 20. Chúng được sử dụng để xử lý lỗi trong trình quản lý ngữ cảnh và chúng phản ánh các giá trị trả về của 21. 8Bạn có thể gọi cuộc gọi đến 37. Bạn có thể sử dụng Trình quản lý ngữ cảnh để làm cho mã ngắn hơn, đơn giản hơn và dễ đọc hơn: 9Mã này không giống như mã ở trên. Sự khác biệt chính là bạn không định nghĩa biến bên ngoài 44, giúp giữ cho không gian tên của bạn sạch hơn.Chạy tập lệnh sẽ cho kết quả quen thuộc: 0Có một vài lợi thế để thêm các khả năng của Trình quản lý ngữ cảnh vào lớp hẹn giờ Python của bạn:
Sử dụng 72 làm trình quản lý bối cảnh gần như linh hoạt như sử dụng trực tiếp 82 và 83, trong khi nó có mã dễ nồi hơi. Trong phần tiếp theo, bạn sẽ học cách bạn có thể sử dụng 72 như một người trang trí. Điều này sẽ giúp dễ dàng theo dõi thời gian chạy của các chức năng hoàn chỉnh.Một người trang trí đồng hồ PythonLớp 72 của bạn hiện rất linh hoạt. Tuy nhiên, có một trường hợp sử dụng mà bạn có thể hợp lý hóa nó hơn nữa. Nói rằng bạn muốn theo dõi thời gian dành cho một chức năng nhất định trong cơ sở mã của bạn. Sử dụng trình quản lý bối cảnh, về cơ bản bạn có hai tùy chọn khác nhau:
Một giải pháp tốt hơn là sử dụng 72 làm người trang trí. Các nhà trang trí là các cấu trúc mạnh mẽ mà bạn sử dụng để sửa đổi hành vi của các chức năng và các lớp. Trong phần này, bạn sẽ tìm hiểu một chút về cách các nhà trang trí hoạt động, làm thế nào bạn có thể mở rộng 72 để trở thành một người trang trí và làm thế nào điều đó sẽ đơn giản hóa các chức năng thời gian. Để biết giải thích chuyên sâu hơn về các nhà trang trí, hãy xem Primer trên các nhà trang trí Python.decorator. Decorators are powerful constructs that you use to modify the behavior of
functions and classes. In this section, you’ll learn a little about how decorators work, how you can extend 72 to be a decorator, and how that will simplify timing functions. For a more in-depth explanation of decorators, see Primer on Python Decorators.Hiểu người trang trí trong PythonMột người trang trí là một chức năng kết thúc một chức năng khác để sửa đổi hành vi của nó. Kỹ thuật này là có thể bởi vì các chức năng là các đối tượng hạng nhất trong Python. Nói cách khác, các hàm có thể được gán cho các biến và được sử dụng làm đối số cho các hàm khác, giống như bất kỳ đối tượng nào khác. Điều này mang lại cho bạn rất nhiều sự linh hoạt và là cơ sở cho một số tính năng mạnh mẽ nhất của Python.decorator is a function that wraps another function to modify its behavior. This technique is possible because functions are first-class objects in Python. In other words, functions can be assigned to variables and used as arguments to other functions, just like any other object. This gives you a lot of flexibility and is the basis for several of Python’s most powerful features. Ví dụ đầu tiên, bạn sẽ tạo ra một người trang trí không làm gì cả: 3Đầu tiên, lưu ý rằng 68 chỉ là một chức năng thông thường. Điều làm cho nó trở thành một nhà trang trí là nó có một chức năng như đối số duy nhất của nó và trả về một chức năng. Bạn có thể sử dụng 68 để sửa đổi các chức năng khác, như thế này:>>> 4Dòng 70 trang trí câu lệnh in với bộ trang trí 68. Thực tế, nó thay thế 27 bằng 73 được trả về bởi 68. Câu lệnh Lambda đại diện cho một hàm ẩn danh không làm gì ngoại trừ return 95.decorates the print statement with the 68 decorator. Effectively, it replaces 27 with 73 returned by 68. The lambda statement represents an anonymous function that does nothing except return 95.Để xác định các nhà trang trí thú vị hơn, bạn cần biết về các chức năng bên trong. Một hàm bên trong là một hàm mà được xác định bên trong một hàm khác. Một cách sử dụng phổ biến của các chức năng bên trong là tạo ra các nhà máy chức năng:inner function is a function that’s defined inside another function. One common use of inner functions is to create function factories: 5 76 là một hàm bên trong, được xác định bên trong 77. Lưu ý rằng bạn có quyền truy cập vào 78 bên trong 76, trong khi 76 được xác định bên ngoài 77:>>> 6Dòng 70 trang trí câu lệnh in với bộ trang trí 68. Thực tế, nó thay thế 27 bằng 73 được trả về bởi 68. Câu lệnh Lambda đại diện cho một hàm ẩn danh không làm gì ngoại trừ return 95.>>> 7Dòng 70 trang trí câu lệnh in với bộ trang trí 68. Thực tế, nó thay thế 27 bằng 73 được trả về bởi 68. Câu lệnh Lambda đại diện cho một hàm ẩn danh không làm gì ngoại trừ return 95. 8Để xác định các nhà trang trí thú vị hơn, bạn cần biết về các chức năng bên trong. Một hàm bên trong là một hàm mà được xác định bên trong một hàm khác. Một cách sử dụng phổ biến của các chức năng bên trong là tạo ra các nhà máy chức năng:
83 là một người trang trí, bởi vì nó là một hàm mong đợi một hàm, 84, là đối số duy nhất của nó và trả về một hàm khác, 85. Lưu ý cấu trúc của chính 83:
Hãy thử nó ra! 00 là một hàm trả về từ 01. Xem điều gì xảy ra nếu nó tăng gấp ba lần:>>> 9Nhân một chuỗi văn bản với một số là một hình thức lặp lại, do đó 01 lặp lại ba lần. Trang trí xảy ra tại 03.Nó cảm thấy hơi khó hiểu khi tiếp tục lặp lại 04. Thay vào đó, PEP 318 đã giới thiệu một cú pháp thuận tiện hơn để áp dụng các nhà trang trí. Định nghĩa sau đây của 00 không giống như ở trên:>>> 0Nhân một chuỗi văn bản với một số là một hình thức lặp lại, do đó 01 lặp lại ba lần. Trang trí xảy ra tại 03.Nó cảm thấy hơi khó hiểu khi tiếp tục lặp lại 04. Thay vào đó, PEP 318 đã giới thiệu một cú pháp thuận tiện hơn để áp dụng các nhà trang trí. Định nghĩa sau đây của 00 không giống như ở trên:>>> Nhân một chuỗi văn bản với một số là một hình thức lặp lại, do đó 01 lặp lại ba lần. Trang trí xảy ra tại 03.Nó cảm thấy hơi khó hiểu khi tiếp tục lặp lại 04. Thay vào đó, PEP 318 đã giới thiệu một cú pháp thuận tiện hơn để áp dụng các nhà trang trí. Định nghĩa sau đây của 00 không giống như ở trên:Biểu tượng 06 được sử dụng để áp dụng các nhà trang trí. Trong trường hợp này, 07 có nghĩa là 83 được áp dụng cho hàm được xác định ngay sau nó.
2Một trong số ít các nhà trang trí được xác định trong thư viện tiêu chuẩn là 09. Điều này khá hữu ích khi xác định trang trí của riêng bạn. Bởi vì các nhà trang trí thay thế hiệu quả một chức năng bằng một chức năng khác, họ tạo ra một vấn đề tinh tế với các chức năng của bạn:>>> 3Nhân một chuỗi văn bản với một số là một hình thức lặp lại, do đó 01 lặp lại ba lần. Trang trí xảy ra tại 03. 4Nó cảm thấy hơi khó hiểu khi tiếp tục lặp lại 04. Thay vào đó, PEP 318 đã giới thiệu một cú pháp thuận tiện hơn để áp dụng các nhà trang trí. Định nghĩa sau đây của 00 không giống như ở trên:Biểu tượng 1# latest_tutorial.py 2 3import time 4from reader import feed 5 6def main(): 7 """Print the latest tutorial from Real Python""" 8 tic = time.perf_counter() 9 tutorial = feed.get_article(0) 10 toc = time.perf_counter() 11 print(f"Downloaded the tutorial in {toc - tic:0.4f} seconds") 12 13 print(tutorial) 14 15if __name__ == "__main__": 16 main() 06 được sử dụng để áp dụng các nhà trang trí. Trong trường hợp này, 1# latest_tutorial.py 2 3import time 4from reader import feed 5 6def main(): 7 """Print the latest tutorial from Real Python""" 8 tic = time.perf_counter() 9 tutorial = feed.get_article(0) 10 toc = time.perf_counter() 11 print(f"Downloaded the tutorial in {toc - tic:0.4f} seconds") 12 13 print(tutorial) 14 15if __name__ == "__main__": 16 main() 07 có nghĩa là >>> import time >>> time.perf_counter() 32311.48899951 >>> time.perf_counter() # A few seconds later 32315.261320793 83 được áp dụng cho hàm được xác định ngay sau nó.Một trong số ít các nhà trang trí được xác định trong thư viện tiêu chuẩn là 09. Điều này khá hữu ích khi xác định trang trí của riêng bạn. Bởi vì các nhà trang trí thay thế hiệu quả một chức năng bằng một chức năng khác, họ tạo ra một vấn đề tinh tế với các chức năng của bạn: 1 5 07 Trang trí 00, sau đó được thay thế bằng hàm bên trong 85, như đầu ra trên xác nhận. Điều này cũng sẽ thay thế tên, DocString và các siêu dữ liệu khác. Thông thường, chiến thắng này có nhiều hiệu quả, nhưng nó có thể làm cho nội tâm khó khăn.>>> 6Nhân một chuỗi văn bản với một số là một hình thức lặp lại, do đó 01 lặp lại ba lần. Trang trí xảy ra tại 03.>>> 7Nhân một chuỗi văn bản với một số là một hình thức lặp lại, do đó 01 lặp lại ba lần. Trang trí xảy ra tại 03.>>> 8Nhân một chuỗi văn bản với một số là một hình thức lặp lại, do đó 01 lặp lại ba lần. Trang trí xảy ra tại 03.Nó cảm thấy hơi khó hiểu khi tiếp tục lặp lại 04. Thay vào đó, PEP 318 đã giới thiệu một cú pháp thuận tiện hơn để áp dụng các nhà trang trí. Định nghĩa sau đây của 00 không giống như ở trên:callables. There are many callable types in Python. You can make your own objects callable by defining the special 25 method in their
class. The following function and class behave similarly:>>> 9Nhân một chuỗi văn bản với một số là một hình thức lặp lại, do đó 01 lặp lại ba lần. Trang trí xảy ra tại 03.Nó cảm thấy hơi khó hiểu khi tiếp tục lặp lại 04. Thay vào đó, PEP 318 đã giới thiệu một cú pháp thuận tiện hơn để áp dụng các nhà trang trí. Định nghĩa sau đây của 00 không giống như ở trên: 0Biểu tượng 06 được sử dụng để áp dụng các nhà trang trí. Trong trường hợp này, 07 có nghĩa là 83 được áp dụng cho hàm được xác định ngay sau nó.Một trong số ít các nhà trang trí được xác định trong thư viện tiêu chuẩn là 09. Điều này khá hữu ích khi xác định trang trí của riêng bạn. Bởi vì các nhà trang trí thay thế hiệu quả một chức năng bằng một chức năng khác, họ tạo ra một vấn đề tinh tế với các chức năng của bạn:>>> 1 1 07 Trang trí 00, sau đó được thay thế bằng hàm bên trong 85, như đầu ra trên xác nhận. Điều này cũng sẽ thay thế tên, DocString và các siêu dữ liệu khác. Thông thường, chiến thắng này có nhiều hiệu quả, nhưng nó có thể làm cho nội tâm khó khăn. 2Khi bạn sử dụng 34 theo cách này, bạn không cần phải tự mình thực hiện 25, vì vậy bạn có thể xóa nó một cách an toàn khỏi lớp 72.Sử dụng máy trang trí đồng hồ PythonTiếp theo, bạn sẽ làm lại ví dụ 57 lần cuối, sử dụng bộ hẹn giờ Python làm người trang trí: 3Nếu bạn so sánh việc thực hiện này với triển khai ban đầu mà không có bất kỳ thời gian nào, thì bạn sẽ nhận thấy rằng sự khác biệt duy nhất là nhập 72 trên dòng 3 và ứng dụng của 41 trên dòng 6. Một lợi thế đáng kể của việc sử dụng các nhà trang trí là chúng Thường đơn giản để áp dụng, như bạn thấy ở đây.Tuy nhiên, người trang trí vẫn áp dụng cho toàn bộ chức năng. Điều này có nghĩa là mã của bạn đang tính đến thời gian để in hướng dẫn, ngoài thời gian cần tải xuống. Chạy tập lệnh một lần cuối cùng: 4Vị trí của đầu ra thời gian trôi qua là một dấu hiệu nhận biết rằng mã của bạn đang xem xét thời gian cần thiết để in. Như bạn thấy ở đây, mã của bạn in thời gian trôi qua sau hướng dẫn. Khi bạn sử dụng 72 làm người trang trí, bạn sẽ thấy những lợi thế tương tự như bạn đã làm với các nhà quản lý bối cảnh:
Tuy nhiên, các nhà trang trí không linh hoạt như các nhà quản lý bối cảnh. Bạn chỉ có thể áp dụng chúng để hoàn thành các chức năng. Nó có thể thêm các nhà trang trí vào các chức năng đã được xác định, nhưng đây là một chút lộn xộn và ít phổ biến hơn. Mã hẹn giờ PythonBạn có thể mở rộng khối mã bên dưới để xem mã nguồn cuối cùng cho bộ đếm thời gian Python của bạn: 5Mã này cũng có sẵn trong kho 73 trên GitHub.Bạn có thể tự mình sử dụng mã bằng cách lưu nó vào một tệp có tên 84 và nhập nó vào chương trình của bạn:>>> 6 72 cũng có sẵn trên PYPI, vì vậy một tùy chọn thậm chí dễ dàng hơn là cài đặt nó bằng cách sử dụng 55:
Lưu ý rằng tên gói trên PYPI là 73. Bạn cần phải sử dụng tên này cả khi bạn cài đặt gói và khi bạn nhập 72:>>> 8 72 cũng có sẵn trên PYPI, vì vậy một tùy chọn thậm chí dễ dàng hơn là cài đặt nó bằng cách sử dụng 55:
Là người quản lý bối cảnh: Là một người trang trí:Loại hẹn giờ python này chủ yếu hữu ích để theo dõi thời gian mã của bạn dành cho các khối hoặc chức năng mã chính riêng lẻ. Trong phần tiếp theo, bạn sẽ nhận được một cái nhìn tổng quan nhanh về các lựa chọn thay thế mà bạn có thể sử dụng nếu bạn muốn tối ưu hóa mã của mình. Các chức năng hẹn giờ python khác Có nhiều tùy chọn để định thời mã của bạn với Python. Trong hướng dẫn này, bạn đã học cách tạo ra một lớp linh hoạt và thuận tiện mà bạn có thể sử dụng theo nhiều cách khác nhau. Một tìm kiếm nhanh trên PYPI cho thấy rằng đã có nhiều dự án có sẵn cung cấp các giải pháp hẹn giờ Python.Trong phần này, trước tiên, bạn sẽ tìm hiểu thêm về các chức năng khác nhau có sẵn trong thư viện tiêu chuẩn để đo thời gian, bao gồm lý do tại sao 43 là thích hợp hơn. Sau đó, bạn sẽ khám phá các lựa chọn thay thế để tối ưu hóa mã của bạn, trong đó 72 không phù hợp.
Sử dụng các chức năng hẹn giờ python thay thế >>> 2 72 cũng có sẵn trên PYPI, vì vậy một tùy chọn thậm chí dễ dàng hơn là cài đặt nó bằng cách sử dụng 55:Lưu ý rằng tên gói trên PYPI là 73. Bạn cần phải sử dụng tên này cả khi bạn cài đặt gói và khi bạn nhập 72:space between the numbers that you can express. This has some consequences when you use a 60 to represent time.Ngoài tên và một số tính năng bổ sung, 49 hoạt động chính xác là 50. Để tóm tắt, bạn có thể sử dụng 72 theo ba cách khác nhau:nanosecond differences:>>> 3Một nanosecond là một tỷ của một giây. Lưu ý rằng việc thêm một nano giây vào 44 không ảnh hưởng đến kết quả. 43, mặt khác, sử dụng một số điểm không xác định theo thời gian làm kỷ nguyên của nó, cho phép nó hoạt động với các số nhỏ hơn và do đó có được độ phân giải tốt hơn:>>> 4Ở đây, bạn nhận thấy rằng việc thêm một nano giây vào 68 thực sự ảnh hưởng đến kết quả. Để biết thêm thông tin về cách làm việc với 45, hãy xem Hướng dẫn dành cho người mới bắt đầu về mô -đun Python Time.Những thách thức với thời gian đại diện cho một 60 đã được biết đến, vì vậy Python 3.7 đã giới thiệu một tùy chọn mới. Mỗi hàm đo 1 hiện có hàm 47 tương ứng trả về số lượng nano giây dưới dạng 38 thay vì số giây là 60. Chẳng hạn, 45 hiện có một đối tác NanoSecond có tên là 76:>>> 5Các số nguyên không bị ràng buộc trong Python, vì vậy điều này cho phép 76 đưa ra độ phân giải nano giây cho tất cả sự vĩnh cửu. Tương tự, 48 là một biến thể nano giây của 43:>>> 6Bởi vì 43 đã cung cấp độ phân giải nano giây, nên có ít lợi thế hơn khi sử dụng 48.Có hai chức năng trong 1 không đo thời gian ngủ. Đây là 44 và 46, rất hữu ích trong một số cài đặt. Tuy nhiên, đối với 72, bạn thường muốn đo toàn bộ thời gian. Hàm cuối cùng trong danh sách trên là 42. Cái tên ám chỉ chức năng này là một bộ đếm thời gian đơn điệu, đó là một bộ đếm thời gian python không bao giờ có thể di chuyển ngược.Tất cả các chức năng này là đơn điệu ngoại trừ 45, có thể đi ngược nếu thời gian hệ thống được điều chỉnh. Trên một số hệ thống, 42 có chức năng tương tự như 43 và bạn có thể sử dụng chúng thay thế cho nhau. Tuy nhiên, đây không phải là luôn luôn như vậy. Bạn có thể sử dụng 90 để có thêm thông tin về chức năng hẹn giờ Python:>>> 7Kết quả có thể khác nhau trên hệ thống của bạn. PEP 418 mô tả một số lý do đằng sau việc giới thiệu các chức năng này. Nó bao gồm các mô tả ngắn sau đây:
Như bạn có thể nói, 43 thường là lựa chọn tốt nhất cho bộ đếm thời gian Python của bạn.Ước tính thời gian chạy với 1# latest_tutorial.py 2 3import time 4from reader import feed 5 6def main(): 7 """Print the latest tutorial from Real Python""" 8 tic = time.perf_counter() 9 tutorial = feed.get_article(0) 10 toc = time.perf_counter() 11 print(f"Downloaded the tutorial in {toc - tic:0.4f} seconds") 12 13 print(tutorial) 14 15if __name__ == "__main__": 16 main() 95Giả sử bạn đang cố gắng vắt hiệu suất cuối cùng ra khỏi mã của mình và bạn đang tự hỏi về cách hiệu quả nhất để chuyển đổi danh sách thành một bộ. Bạn muốn so sánh bằng cách sử dụng 96 và thiết lập theo nghĩa đen, 97. Bạn có thể sử dụng bộ đếm thời gian Python của mình cho việc này:>>> 8Thử nghiệm này dường như chỉ ra rằng chữ đã thiết lập có thể nhanh hơn một chút. Tuy nhiên, những kết quả này khá không chắc chắn và nếu bạn chạy lại mã, bạn có thể nhận được kết quả cực kỳ khác nhau. Điều đó bởi vì bạn chỉ thử mã một lần. Ví dụ, bạn có thể không may mắn và chạy tập lệnh giống như máy tính của bạn đang trở nên bận rộn với các tác vụ khác. Một cách tốt hơn là sử dụng thư viện tiêu chuẩn 95. Nó đã thiết kế chính xác để đo thời gian thực hiện của các đoạn mã nhỏ. Mặc dù bạn có thể nhập và gọi 99 từ Python như một hàm thông thường, nhưng nó thường thuận tiện hơn khi sử dụng giao diện dòng lệnh. Bạn có thể thời gian hai biến thể như sau: 9 95 tự động gọi mã của bạn nhiều lần để trung bình các phép đo ồn ào. Các kết quả từ 95 xác nhận rằng chữ đã thiết lập nhanh hơn 96.Cuối cùng, Shell Interactive Ipython và Notebook Jupyter có hỗ trợ thêm cho chức năng này với lệnh 03 Magic:>>> 0Một lần nữa, các phép đo chỉ ra rằng sử dụng một thiết lập theo nghĩa đen nhanh hơn. Trong máy tính xách tay Jupyter, bạn cũng có thể sử dụng ma thuật tế bào 04 để đo thời gian chạy toàn bộ ô.Tìm kiếm tắc nghẽn trong mã của bạn với các trình cấu hình 95 là tuyệt vời để đánh giá một đoạn mã cụ thể. Tuy nhiên, sẽ rất cồng kềnh khi sử dụng nó để kiểm tra tất cả các phần của chương trình của bạn và định vị phần nào mất nhiều thời gian nhất. Thay vào đó, bạn có thể sử dụng một trình hồ sơ.profiler. 06 là một trình hồ sơ mà bạn có thể truy cập bất cứ lúc nào từ thư viện tiêu chuẩn. Bạn có thể sử dụng nó theo nhiều cách, mặc dù nó thường đơn giản nhất khi sử dụng nó như một công cụ dòng lệnh: 1Lệnh này chạy 57 khi được bật định lập. Bạn lưu đầu ra từ 06 trong 09, theo quy định của tùy chọn 10. Dữ liệu đầu ra ở định dạng nhị phân cần một chương trình chuyên dụng để hiểu ý nghĩa của nó. Một lần nữa, Python có một tùy chọn ngay trong thư viện tiêu chuẩn! Chạy mô -đun 11 trên tệp 12 của bạn mở trình duyệt thống kê hồ sơ tương tác: 2Để sử dụng 11, bạn nhập các lệnh tại dấu nhắc. Ở đây bạn có thể thấy hệ thống trợ giúp tích hợp. Thông thường, bạn sẽ sử dụng các lệnh 14 và 15. Để có được đầu ra sạch hơn, 16 có thể hữu ích: 3Đầu ra này cho thấy tổng thời gian chạy là 0,586 giây. Nó cũng liệt kê mười chức năng nơi mã của bạn dành phần lớn thời gian. Ở đây, bạn đã sắp xếp theo thời gian tích lũy ( 17), điều đó có nghĩa là mã của bạn tính thời gian khi hàm đã cho được gọi là một hàm khác.Bạn có thể thấy rằng mã của bạn dành hầu như tất cả thời gian trong mô -đun 18 và đặc biệt là bên trong 19. Mặc dù điều này có thể là xác nhận hữu ích về những gì bạn đã biết, nhưng nó thường thú vị hơn khi tìm thấy mã của bạn thực sự dành thời gian.Cột tổng thời gian ( 20) cho biết mã của bạn dành bao nhiêu thời gian trong một hàm, không bao gồm thời gian trong các chức năng phụ. Bạn có thể thấy rằng không có chức năng nào ở trên thực sự dành thời gian để làm điều này. Để tìm mã dành phần lớn thời gian của nó, hãy đưa ra một lệnh 14 khác: 4Bây giờ bạn có thể thấy rằng 57 thực sự dành phần lớn thời gian làm việc với ổ cắm hoặc xử lý dữ liệu bên trong 23. Cái sau là một trong những phụ thuộc của đầu đọc Python thực sự mà Lừa sử dụng để phân tích thức ăn hướng dẫn.Bạn có thể sử dụng 11 để có một số ý tưởng về nơi mã của bạn dành phần lớn thời gian và sau đó cố gắng tối ưu hóa bất kỳ nút thắt nào bạn tìm thấy. Bạn cũng có thể sử dụng công cụ để hiểu cấu trúc của mã của bạn tốt hơn. Chẳng hạn, các lệnh 25 và 26 sẽ hiển thị cho bạn những chức năng nào được gọi và được gọi bởi một hàm nhất định.bottlenecks you find. You can also use the tool to understand the structure of your code
better. For instance, the commands 25 and 26 will show you which functions call and are called by a given function.Bạn cũng có thể điều tra các chức năng nhất định. Kiểm tra số lượng chi phí 72 nguyên nhân bằng cách lọc kết quả với cụm từ 28: 5May mắn thay, 72 chỉ gây ra chi phí tối thiểu. Sử dụng 30 để rời trình duyệt 11 khi bạn điều tra xong.Đối với giao diện mạnh hơn vào dữ liệu hồ sơ, hãy xem Kcachegrind. Nó sử dụng định dạng dữ liệu của riêng mình, nhưng bạn có thể chuyển đổi dữ liệu từ 06 bằng cách sử dụng 33: 6Lệnh này sẽ chuyển đổi 09 và mở Kcachegrind để phân tích dữ liệu.Tùy chọn cuối cùng mà bạn sẽ thử ở đây để định thời gian mã của bạn là 35. 06 có thể cho bạn biết chức năng nào mã của bạn dành nhiều thời gian nhất, nhưng nó đã giành được cho bạn những hiểu biết sâu sắc về dòng bên trong hàm đó là chậm nhất. Đó là nơi mà 35 có thể giúp bạn.Lưu ý rằng hồ sơ dòng cần có thời gian và thêm một chút chi phí cho thời gian chạy của bạn. Một quy trình công việc bình thường trước tiên là sử dụng 06 để xác định chức năng nào cần điều tra và sau đó chạy 35 trên các chức năng đó. 35 là một phần của thư viện tiêu chuẩn, vì vậy trước tiên bạn nên làm theo các hướng dẫn cài đặt để thiết lập nó.Trước khi bạn chạy Profiler, bạn cần cho nó biết chức năng nào để cấu hình. Bạn làm điều này bằng cách thêm một trình trang trí 41 bên trong mã nguồn của bạn. Ví dụ: để cấu hình 42, bạn thêm phần sau bên trong 84: 7Lưu ý rằng bạn không nhập khẩu 44 ở bất cứ đâu. Thay vào đó, nó tự động thêm vào không gian tên toàn cầu khi bạn chạy trình hồ sơ. Mặc dù vậy, bạn cần phải xóa dòng khi bạn thực hiện định hình. Nếu không, bạn sẽ nhận được một 45.Tiếp theo, chạy trình hồ sơ bằng 46, là một phần của gói 35: 8Lệnh này tự động lưu dữ liệu hồ sơ trong một tệp có tên 48. Bạn có thể thấy những kết quả đó bằng cách sử dụng 35: 9Đầu tiên, lưu ý rằng đơn vị thời gian trong báo cáo này là micro giây ( 50). Thông thường, số lượng dễ tiếp cận nhất để xem là 51, cho bạn biết tỷ lệ phần trăm của tổng thời gian mã của bạn dành bên trong một hàm ở mỗi dòng. Trong ví dụ này, bạn có thể thấy rằng mã của bạn dành gần 70 phần trăm thời gian trên dòng 47, đó là dòng định dạng và in kết quả của bộ đếm thời gian.Sự kết luậnTrong hướng dẫn này, bạn đã thử một số cách tiếp cận khác nhau để thêm bộ hẹn giờ python vào mã của bạn:
Bạn cũng đã học được lý do tại sao bạn nên thích 40 hơn 56 khi mã điểm chuẩn, cũng như những lựa chọn thay thế khác hữu ích khi bạn tối ưu hóa mã của mình.Bây giờ bạn có thể thêm các chức năng hẹn giờ Python vào mã của riêng bạn! Theo dõi mức độ nhanh chóng của chương trình của bạn trong nhật ký của bạn sẽ giúp bạn theo dõi các tập lệnh của bạn. Bạn có ý tưởng cho các trường hợp sử dụng khác trong đó các lớp học, người quản lý bối cảnh và nhà trang trí chơi tốt với nhau không? Để lại một bình luận dưới đây! Tài nguyênĐể đi sâu hơn vào các chức năng hẹn giờ Python, hãy xem các tài nguyên này:
Làm thế nào để bạn làm cho Python đợi 5 giây?Nếu bạn đã có một chương trình Python và bạn muốn chờ đợi, bạn có thể sử dụng một hàm đơn giản như thế này: Time.s ngủ (x) trong đó x là số giây mà bạn muốn chương trình của bạn chờ đợi.time. sleep(x) where x is the number of seconds that you want your program to wait. |