Thời gian được đo bằng Python là gì?
Mặc dù nhiều nhà phát triển công nhận Python là ngôn ngữ lập trình hiệu quả, nhưng các chương trình Python thuần túy có thể chạy chậm hơn so với các chương trình đối tác của chúng 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 tốc độ chạy chương trình của bạn Show
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 cơ bản về cách hoạt động của các lớp, trình quản lý ngữ cảnh và trình trang trí. 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 mình, để định thời gian thực thi mã, cũng như trong các ứng dụng khác. Mỗi phương pháp đều có ưu điểm của nó và bạn sẽ học cách sử dụng tùy thuộc vào tình huống. Ngoài ra, bạn sẽ có một bộ đếm thời gian Python đang 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ười trang trí Bảng điểm hỏi đáp. Nhấp vào đây để có quyền truy cập vào nhật ký trò chuyện dài 25 trang từ phiên Hỏi & Đáp về người trang trí Python của chúng tôi trong Slack Cộng đồng Python thực, nơi chúng tôi đã thảo luận về các câu hỏi phổ biến về người trang trí Bộ hẹn giờ PythonTrước tiên, bạn sẽ xem qua 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 bộ hẹn giờ Python vào mã này để theo dõi hiệu suất của nó. Bạn cũng sẽ tìm hiểu một số cách đơn giản nhất để đo thời gian chạy của ví dụ này Loại bỏ các quảng cáoChức năng hẹn giờ PythonNếu bạn kiểm tra mô-đun 4 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
Trăn 3. 7 đã giới thiệu một số chức năng mới, như 9, 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 bằng hậu tố 00. Ví dụ, 01 là phiên bản nano giây của 6. Bạn sẽ tìm hiểu thêm về các chức năng này sau. Hiện tại, hãy lưu ý những gì tài liệu nói về 6
Đầu tiên, bạn sẽ sử dụng 6 để tạo bộ đếm thời gian Python. Sau đó, bạn sẽ so sánh hàm này với các hàm hẹn giờ khác của Python và tìm hiểu lý do tại sao 6 thường là lựa chọn tốt nhấtVí 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ộ đếm thời gian Python vào mã của mình, bạn sẽ áp dụng các hàm bộ đếm thời gian Python khác nhau cho cùng một ví dụ mã trong suốt hướng dẫn này. Nếu bạn đã có mã mà bạn muốn đo lường, thì thay vào đó, vui lòng làm theo các ví dụ với mã đó 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 06 để 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ề Trình đọc Python thực và cách thức hoạt động của nó, hãy xem Cách xuất bản Gói Python mã nguồn mở lên PyPI. Bạn có thể cài đặt 06 trên hệ thống của mình với 08 6Sau đó, bạn có thể nhập gói dưới dạng 09Bạn sẽ lưu trữ ví dụ trong một tệp có tên 10. Mã 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
06 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 trông giống như thế này 7Mã 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 Đồng hồ bấm giờ Python đầu tiên của bạnBây giờ, bạn sẽ thêm một bộ đếm thời gian Python cơ bản vào ví dụ với 3. Một lần nữa, đây là bộ đếm hiệu suất rất phù hợp để định thời gian cho các phần mã của bạn 6 đo thời gian tính bằng giây từ một số thời điểm không xác định, điều đó có nghĩa là giá trị trả về của một lệnh gọi hàm không hữu ích. Tuy nhiên, khi bạn nhìn vào sự khác biệt giữa hai lần gọi đến 6, bạn có thể biết được có bao nhiêu giây trôi qua giữa hai lần gọi>>> 1Trong ví dụ này, bạn đã thực hiện hai cuộc gọi đến 6 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 sự khác biệt giữa hai đầu ra. 32315. 26 - 32311. 49 = 3. 77Bây giờ bạn có thể thêm bộ hẹn giờ Python vào mã ví dụ 3Lưu ý rằng bạn gọi 6 cả trước và sau khi tải xuống hướng dẫn. Sau đó, bạn in thời gian cần thiết để 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ọiGhi chú. Trong dòng 11, 23 trước chuỗi cho biết đây là chuỗi f, đây là cách thuận tiện để định dạng chuỗi văn bản. 24 là một công cụ xác định định dạng cho biết số, 25, phải được in dưới dạng số thập phân có bốn số thập phânĐể biết thêm thông tin về chuỗi f, hãy xem Chuỗi f của Python 3. Cú pháp định dạng chuỗi được cải thiện Bây giờ, khi bạn chạy ví dụ, bạn sẽ thấy thời gian đã trôi qua trước phần hướng dẫn 8Đó là nó. Bạn đã nắm được kiến thức cơ bản về định thời gian cho mã Python của riêng mình. Trong phần còn lại của hướng dẫn, bạn sẽ học cách gói bộ đếm thời gian Python vào một lớp, trình quản lý ngữ cảnh và trình trang trí để làm cho nó nhất quán và thuận tiện hơn khi sử dụng Loại bỏ các quảng cáoLớp hẹn giờ PythonNhìn lại cách bạn đã thêm bộ đếm thời gian Python vào ví dụ trên. Lưu ý rằng bạn cần ít nhất một biến ( 26) để lưu trữ trạng thái của bộ đếm thời gian Python trước khi 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 tính thời gian. Bây giờ, bạn sẽ tạo một lớp thực hiện giống như các lệnh gọi thủ công của bạn tới 6, nhưng theo cách dễ đọc và nhất quán hơnXuyên suốt hướng dẫn này, bạn sẽ tạo và cập nhật 28, một lớp mà bạn có thể sử dụng để định thời gian cho 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 với tên 29. Bạn có thể cài đặt cái này trên hệ thống của mình như vậy 3Bạn có thể tìm thêm thông tin về 29 sau trong hướng dẫn này, trong phần có tên Mã hẹn giờ PythonHiểu các lớp trong PythonCác lớp là khối xây dựng chính của lập trình hướng đối tượng. Về cơ bản, một lớp là một khuôn mẫu mà bạn có thể sử dụng để tạo các đối tượng. Mặc dù Python không bắt buộc bạn phải lập trình theo cách hướng đối tượng, nhưng các lớp có ở khắp mọi nơi trong ngôn ngữ này. Để chứng minh nhanh chóng, hãy điều tra mô-đun 4>>> 6 32 trả về loại đối tượng. Ở đây bạn có thể thấy rằng các mô-đun trên thực tế là các đối tượng được tạo từ một lớp 33. Bạn có thể sử dụng thuộc tính đặc biệt 34 để truy cập vào lớp định nghĩa một đối tượng. Trên thực tế, hầu hết mọi thứ trong Python đều là một lớp>>> 0Trong Python, các lớp rất tuyệt khi bạn cần mô hình hóa thứ gì đó cần theo dõi một trạng thái cụ thể. Nói chung, một lớp là một tập hợp các thuộc tính, được gọi là thuộc tính và hành vi, được gọi là phương thức. Để biết thêm thông tin cơ bản về các lớp và lập trình hướng đối tượng, hãy xem Lập trình hướng đối tượng (OOP) trong Python 3 hoặc tài liệu chính thức Tạo lớp hẹn giờ PythonCác lớp tốt cho việc theo dõi trạng thái. Trong một lớp học 28, bạn muốn theo dõi thời điểm bắt đầu tính giờ và thời gian đã trôi qua kể từ đó. Đối với lần triển khai đầu tiên của 28, bạn sẽ thêm thuộc tính 37, cũng như các phương thức 38 và 39. Thêm đoạn mã sau vào tệp có tên 40
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 để xem qua mã từng bước Ở dòng 5, bạn định nghĩa một lớp 41. Ký hiệu 42 có nghĩa là 41 kế thừa từ một lớp khác có tên là 44. Python sử dụng lớp dựng sẵn 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 41, nhưng việc có lỗi tùy chỉnh sẽ giúp bạn linh hoạt hơn trong việc xử lý sự cố bên trong 28. Để biết thêm thông tin, hãy xem Ngoại lệ Python. Một lời giới thiệuBản thân định nghĩa của 28 bắt đầu từ 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 sẽ gọi phương thức đặc biệt 48. Trong phiên bản đầu tiên này của 28, bạn chỉ khởi tạo thuộc tính 37 mà bạn sẽ sử dụng để theo dõi trạng thái của bộ hẹn giờ Python của mình. Nó có giá trị 51 khi bộ đếm thời gian không chạy. Khi bộ hẹn giờ đang chạy, 37 sẽ theo dõi thời điểm bộ hẹn giờ bắt đầuGhi chú. Tiền tố gạch dưới ( 53) của 37 là một quy ước của Python. Nó báo hiệu rằng 37 là một thuộc tính bên trong mà người dùng của lớp 28 không nên thao túngKhi bạn gọi 38 để bắt đầu một bộ đếm thời gian Python mới, trước tiên bạn hãy kiểm tra xem bộ đếm thời gian chưa chạy chưa. Sau đó, bạn lưu trữ giá trị hiện tại của 6 trong 37Mặt khác, khi bạn gọi 39, trước tiên bạn kiểm tra xem bộ hẹn giờ Python có đang chạy không. Nếu đúng như vậy, 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 6 và giá trị mà bạn đã lưu trữ trong 37. Cuối cùng, bạn đặt lại 37 để có thể khởi động lại bộ đếm thời gian và in thời gian đã trôi quaĐây là cách bạn sử dụng 28>>> 0Compare this to the earlier example where you used 6 directly. The structure of the code is fairly similar, but now the code is clearer, and this is one of the benefits of using classes. By carefully choosing your class, method, and attribute names, you can make your code very descriptiveLoại bỏ các quảng cáoUsing the Python Timer ClassBây giờ áp dụng 28 đến 10. You only need to make a few changes to your previous code 1Notice that the code is very similar to what you used earlier. In addition to making the code more readable, 28 takes care of printing the elapsed time to the console, which makes the logging of time spent more consistent. When you run the code, you’ll get pretty much the same output 2Printing the elapsed time from 28 may be consistent, but it seems that this approach is not very flexible. In the next section, you’ll see how to customize your classAdding More Convenience and FlexibilitySo far, you’ve learned that classes are suitable for when you want to encapsulate state and ensure consistent behavior in your code. In this section, you’ll add more convenience and flexibility to your Python timer
First, see how you can customize the text used to report the time spent. In the previous code, the text 70 is hard-coded into 39. You can add flexibility to classes using instance variables, whose values are normally passed as arguments to 48 and stored as 73 attributes. For convenience, you can also provide reasonable default valuesTo add 74 as a 28 instance variable, you’ll do something like this in 40 3Note that the default text, 77, is given as a regular string, not as an f-string. You can’t use an f-string here because f-strings evaluate immediately, and when you instantiate 28, your code hasn’t yet calculated the elapsed timeNote. If you want to use an f-string to specify 74, then you need to use double curly braces to escape the curly braces that the actual elapsed time will replaceOne example would be 80. If the value of 81 is 82, then this f-string would be evaluated as 83In 39, you use 74 as a template and 86 to populate the template 4After this update to 40, you can change the text as follows>>> 5Tiếp theo, giả sử rằng bạn không chỉ muốn in một tin nhắn ra bàn điều khiển. Có thể bạn muốn lưu số đo thời gian của mình để có thể lưu trữ chúng trong cơ sở dữ liệu. Bạn có thể làm điều này bằng cách trả về giá trị của 88 từ 39. Sau đó, mã gọi có thể chọn bỏ qua giá trị trả về đó hoặc lưu nó để xử lý sauCó lẽ bạn muốn tích hợp 28 vào thói quen ghi nhật ký của mình. Để hỗ trợ ghi nhật ký hoặc các đầu ra khác từ 28, bạn cần thay đổi cuộc gọi thành 92 để 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 92, bạn tạo một biến thể hiện khác ở dòng 13, 94, tham chiếu đến một hàm lấy một chuỗi làm đối số. Ngoài 92, bạn có thể sử dụng các hàm như 96 hoặc 97 trên các đối tượng tệp. Cũng lưu ý kiểm tra 98 ở dòng 25, cho phép bạn tắt hoàn toàn tính năng in bằng cách vượt qua 99Dưới đây là hai ví dụ cho thấy chức năng mới đang hoạt động >>> 7Khi bạn chạy các ví dụ này trong trình bao 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 vào 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, chẳng hạn như khi bạn đang 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ộ hẹn giờ Python trong mã của bạn Giả sử rằng bạn đang mở rộng 10 thành tập lệnh 701 để tải xuống và in mười hướng dẫn mới nhất từ Real Python. Sau đây là một thực hiện có thể 8Đoạn mã lặp qua các số từ 0 đến 9 và sử dụng các số đó làm đối số bù cho 702. 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 đề tế nhị với đoạn mã này là bạn đang đo không chỉ thời gian cần thiết để tải xuống các hướng dẫn mà còn cả thời gian Python dành để 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 dành cho in ấ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 để tính thời gian chính xác cho những gì bạn đang theo đuổi trong những tình huống như thế này Ghi chú. Thời gian tải xuống mười hướng dẫn bằng thời gian tải xuống một hướng dẫn. Đây không phải là một lỗi trong mã của bạn. Thay vào đó, 09 lưu trữ nguồn cấp dữ liệu Python thực vào lần đầu tiên 704 được gọi và sử dụng lại thông tin trong các lần gọi sauCó một số cách mà bạn có thể giải quyết vấn đề này mà không thay đổi cách triển khai hiện tại của 705. 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ể thực hiện chỉ với một vài dòng mãTrước tiên, bạn sẽ giới thiệu một từ điển có tên là 706 dưới dạng một biến lớp trên 28, có nghĩa là tất cả các phiên bản của 28 sẽ chia sẻ nó. Bạn triển khai nó bằng cách định nghĩa nó bên ngoài bất kỳ phương thức nào 70Cá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 thể hiện của lớp >>> 71Trong cả hai trường hợp, mã trả về cùng một từ điển lớp trống Tiếp theo, bạn sẽ thêm tên tùy chọn vào bộ đếm thời gian Python của mình. Bạn có thể sử dụng tên cho hai mục đích khác nhau
Để thêm tên vào bộ đếm thời gian Python của bạn, bạn cần thực hiện thêm hai thay đổi đối với 40. Đầu tiên, 28 nên chấp nhận 711 làm tham số. Thứ hai, thời gian đã trôi qua phải được thêm vào 706 khi đồng hồ bấm giờ dừng 72Lưu ý rằng bạn sử dụng 713 khi thêm bộ đếm thời gian Python mới vào 706. Đây là một tính năng tuyệt vời chỉ đặt giá trị nếu 711 chưa được định nghĩa trong từ điển. Nếu 711 đã được sử dụng trong 706, thì giá trị này sẽ không bị ảnh hưởng. Điều này cho phép bạn tích lũy một số bộ tính giờ>>> 73Giờ đây, bạn có thể truy cập lại 701 và đảm bảo rằng chỉ đo thời gian dành cho việc tải xuống các hướng dẫn 74Chạy lại tập lệnh sẽ cho đầu ra tương tự như trước đó, mặc dù bây giờ bạn chỉ định thời gian tải xuống hướng dẫn thực tế 75Cải tiến cuối cùng mà bạn sẽ thực hiện đối với 28 là làm cho nó có nhiều thông tin hơn khi bạn làm việc với nó một cách tương tác. Hãy thử những điều sau đây>>> 76Dòng cuối cùng đó là cách mặc định mà Python đại diện cho các đối tượng. Mặc dù bạn có thể thu thập một số thông tin từ nó, nhưng nó thường không hữu ích lắm. Thay vào đó, thật tuyệt khi xem thông tin như tên của 28 hoặc cách nó sẽ báo cáo về thời gianTrong Trăn 3. 7, các lớp dữ liệu đã được thêm vào thư viện chuẩn. Chúng cung cấp một số tiện ích cho các lớp của bạn, bao gồm một chuỗi biểu diễn nhiều thông tin hơn Ghi chú. Các lớp dữ liệu chỉ được bao gồm trong Python cho phiên bản 3. 7 trở lên. Tuy nhiên, có sẵn một backport trên PyPI cho Python 3. 6 Bạn có thể cài đặt nó bằng cách sử dụng 08 77Xem Các lớp dữ liệu trong Python 3. 7+ (Hướng dẫn) để biết thêm thông tin Bạn chuyển đổi bộ đếm thời gian Python của mình thành một lớp dữ liệu bằng cách sử dụng trình trang trí 722. Bạn sẽ tìm hiểu thêm về decorator sau trong hướng dẫn này. Hiện tại, bạn có thể coi đây là một ký hiệu cho Python biết rằng 28 là một lớp dữ liệu 78Mã này thay thế phương pháp 48 trước đó của bạn. Note how data classes use syntax that looks similar to the class variable syntax that you saw earlier for defining all variables. In fact, 48 is created automatically for data classes, based on annotated variables in the definition of the classYou need to annotate your variables to use a data class. You can use this annotation to add type hints to your code. If you don’t want to use type hints, then you can instead annotate all variables with 726, just like you did above. You’ll soon learn how to add actual type hints to your data classHere are a few notes about the 28 data class
Lớp dữ liệu 28 mới của bạn hoạt động giống như lớp thông thường trước đó của bạn, ngoại trừ việc nó hiện có một biểu diễn đẹp>>> 79Bây giờ bạn có một phiên bản khá gọn gàng của 28 nhất quán, linh hoạt, thuận tiện và nhiều thông tin. Bạn cũng 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 dự án của mìnhTrước khi kết thúc phần này, hãy xem lại mã nguồn hoàn chỉnh của 28 như hiện tại. Bạn sẽ nhận thấy việc thêm các gợi ý loại vào mã để có thêm tài liệu 10Sử dụng một lớp để tạo bộ đếm thời gian 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 để mã chạy. Tuy nhiên, trong các phần tiếp theo, bạn sẽ tìm hiểu về cách sử dụng trình quản lý ngữ cảnh và trình trang trí, điều này sẽ thuận tiện hơn cho việc định thời gian cho các khối mã và chức năng Loại bỏ các quảng cáoTrình quản lý bối cảnh hẹn giờ PythonLớp Python 28 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ã soạn sẵn cần thiết để sử dụng 28 của bạn
May mắn thay, Python có một cấu trúc duy nhất để gọi các hàm 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 trình quản lý ngữ cảnh và câu lệnh 751 của Python là gì, cũng như cách bạn có thể tạo trình quản lý ngữ cảnh của riêng mình. Sau đó, bạn sẽ mở rộng 28 để nó cũng có thể hoạt động như một trình quản lý bối cảnh. Cuối cùng, bạn sẽ thấy cách sử dụng 28 làm trình quản lý bối cảnh có thể đơn giản hóa mã của bạnHiểu Trình quản lý ngữ cảnh trong PythonTrì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 PEP 343 giới thiệu vào năm 2005 và lần đầu tiên được triển khai trong Python 2. 5. Bạn có thể nhận ra trình quản lý ngữ cảnh trong mã bằng cách sử dụng từ khóa 751 11 755 là một số biểu thức Python trả về trình quản lý bối cảnh. Trình quản lý ngữ cảnh được tùy chọn ràng buộc với tên 756. Cuối cùng, 757 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 khi 757 và một số mã khác sau khi 757 thực thi. Điều sau sẽ xảy ra, ngay cả khi 757 đưa ra một ngoại lệViệc sử dụng phổ biến nhất của trình quản lý ngữ cảnh có thể là xử lý các tài nguyên khác nhau, như tệp, khóa và kết nối cơ sở dữ liệu. Sau đó, trình quản lý ngữ cảnh được sử dụng để giải phóng và dọn sạch tài nguyên sau khi bạn sử dụng xong. Ví dụ sau cho thấy cấu trúc cơ bản của 40 bằng cách chỉ in các dòng có chứa dấu hai chấm. Quan trọng hơn, nó hiển thị thành ngữ phổ biến để mở tệp bằng Python>>> 12Lưu ý rằng 762, con trỏ tệp, không bao giờ được đóng một cách rõ ràng vì bạn đã sử dụng 763 làm trình quản lý ngữ cảnh. Bạn có thể xác nhận rằng 762 đã tự động đóng>>> 13Trong ví dụ này, 765 là một biểu thức trả về trình quản lý ngữ cảnh. Trình quản lý bối cảnh đó bị ràng buộc với tên 762. Trình quản lý bối cảnh có hiệu lực trong quá trình thực thi 92. Khối mã một dòng này thực thi trong ngữ cảnh của 762Điều đó có nghĩa là gì khi 762 là một trình quản lý bối cảnh? . Có nhiều giao thức khác nhau nằm dưới ngôn ngữ Python. Bạn có thể nghĩ về một giao thức như một hợp đồng nêu rõ những phương pháp cụ thể mà mã của bạn phải triển khaiGiao thức quản lý bối cảnh bao gồm hai phương thức
Nói cách khác, để tự tạo trình quản lý bối cảnh, bạn cần viết một lớp triển khai 771 và 772. Không nhiều không ít. Hãy thử một Hello, World. ví dụ quản lý bối cảnh 14 775 là trình quản lý bối cảnh vì nó triển khai giao thức quản lý bối cảnh. Bạn có thể sử dụng nó như thế này>>> 15Trước tiên, hãy lưu ý cách 771 được gọi trước khi bạn làm công việc, trong khi 772 được gọi sau. Trong ví dụ đơn giản 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 đặt tên cho trình quản lý ngữ cảnh bằng 778Tiếp theo, chú ý cách 771 trả về 73. Giá trị trả về của 771 bị ràng buộc bởi 778. Bạn thường muốn trả về 73 từ 771 khi tạo trình quản lý bối cảnh. Bạn có thể sử dụng giá trị trả về đó như sau>>> 16Cuối cùng, 772 có ba đối số. 786, 787 và 788. Chúng được sử dụng để xử lý lỗi trong trình quản lý bối cảnh và chúng phản ánh các giá trị trả về của 789Nế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 772 với loại ngoại lệ, một thể hiện ngoại lệ và một đối tượng truy nguyên. Thông thường, bạn có thể bỏ qua những điều này trong trình quản lý ngữ cảnh của mình, trong trường hợp đó, 772 được gọi trước khi ngoại lệ được kích hoạt lại>>> 17Bạn có thể thấy rằng 792 được in, mặc dù có lỗi trong mãBây giờ bạn đã biết trình quản lý ngữ cảnh là gì và cách bạn có thể tạo trình quản lý ngữ cảnh của riêng mình. Nếu bạn muốn tìm hiểu sâu hơn, hãy xem 793 trong thư viện tiêu chuẩn. Nó bao gồm các cách thuận tiện để xác định trình quản lý ngữ cảnh mới, cũng như các trình quản lý ngữ cảnh được tạo sẵn mà bạn có thể sử dụng để đóng đối tượng, loại bỏ lỗi hoặc thậm chí không làm gì cả. Để biết thêm thông tin, hãy xem Trình quản lý bối cảnh và Tuyên bố 751 của PythonLoại bỏ các quảng cáoTạo Trình quản lý bối cảnh hẹn giờ PythonBạn đã thấy cách các trình quản lý ngữ cảnh hoạt động nói chung, nhưng chúng có thể trợ giúp như thế nào với mã thời gian? . Cho đến nay, bạn cần gọi rõ ràng 38 và 39 khi định thời gian cho mã của mình, nhưng trình quản lý ngữ cảnh có thể tự động thực hiện việc nàyMột lần nữa, để 28 hoạt động như một trình quản lý ngữ cảnh, nó cần tuân thủ giao thức của trình quản lý ngữ cảnh. Nói cách khác, nó phải triển khai 771 và 772 để bắt đầu và dừng bộ hẹn giờ Python. Tất cả các chức năng cần thiết đã có sẵn, vì vậy bạn không cần phải viết nhiều mã mới. Chỉ cần thêm các phương thức sau vào lớp 28 của bạn 18 28 hiện là trình quản lý ngữ cảnh. Phần quan trọng của việc triển khai là 771 gọi 38 để bắt đầu bộ đếm thời gian Python khi ngữ cảnh được nhập và 772 sử dụng 39 để dừng bộ đếm thời gian Python khi mã rời khỏi ngữ cảnh. dùng thử>>> 19Bạn cũng nên lưu ý thêm hai chi tiết tinh tế
772 không xử lý lỗi trong trường hợp này. Tuy nhiên, một trong những tính năng tuyệt vời của trình quản lý bối cảnh là chúng được đảm bảo gọi 772, bất kể bối cảnh thoát ra như thế nào. Trong ví dụ sau, bạn cố tình tạo ra một lỗi bằng cách chia cho 0>>> 30Lưu ý rằng 28 in ra thời gian đã trôi qua, mặc dù mã bị lỗi. Có thể kiểm tra và loại bỏ lỗi trong 772. Xem tài liệu để cho biết thêm thông tin chi tiếtSử dụng Trình quản lý bối cảnh hẹn giờ PythonBây giờ bạn sẽ học cách sử dụng trình quản lý ngữ cảnh 28 để tính thời gian tải xuống các hướng dẫn Real Python. Nhớ lại cách bạn sử dụng 28 trước đó 31Bạn đang tính thời gian cuộc gọi tới 702. Bạn có thể sử dụng trình quản lý bối cảnh để làm cho mã ngắn hơn, đơn giản hơn và dễ đọc hơn 32Mã này hầu như giống như mã ở trên. Sự khác biệt chính là bạn không xác định biến ngoại lai 112, giúp không gian tên của bạn sạch hơnChạy tập lệnh sẽ cho kết quả quen thuộc 33Có một vài lợi thế khi thêm các khả năng của trình quản lý bối cảnh vào lớp bộ đếm thời gian Python của bạn
Sử dụng 28 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 38 và 39, trong khi nó có ít mã soạn sẵn hơn. Trong phần tiếp theo, bạn sẽ tìm hiểu cách sử dụng 28 làm 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 hơnLoại bỏ các quảng cáoTrình trang trí bộ đếm thời gian PythonLớp 28 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. Giả sử bạn muốn theo dõi thời gian sử dụng bên trong một chức năng nhất định trong cơ sở mã của mình. 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 28 làm công cụ trang trí. Trì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 hàm và lớp. Trong phần này, bạn sẽ tìm hiểu một chút về cách hoạt động của bộ trang trí, cách bạn có thể mở rộng 28 thành bộ trang trí và cách điều đó sẽ đơn giản hóa các chức năng định thời gian. Để được giải thích sâu hơn về các công cụ trang trí, hãy xem Primer on Python DecoratorsHiểu về người trang trí trong PythonTrình trang trí là một chức năng bao bọc một chức năng khác để sửa đổi hành vi của nó. Kỹ thuật này có thể thực hiện được vì hàm là đố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 Ví dụ đầu tiên, bạn sẽ tạo một trình trang trí không làm gì cả 36Đầu tiên, lưu ý rằng 136 chỉ là một hàm thông thường. Điều làm cho cái này trở thành một công cụ trang trí là nó nhận một hàm làm đối số duy nhất của nó và trả về một hàm. Bạn có thể sử dụng 136 để sửa đổi các chức năng khác, như thế này>>> 37Dòng 138 trang trí câu lệnh in bằng trình trang trí 136. Thực tế, nó thay thế 92 bằng 141 được trả về bởi 136. Câu lệnh lambda đại diện cho một hàm ẩn danh không làm gì ngoại trừ trả về 51Để xác định các trình trang trí thú vị hơn, bạn cần biết về các chức năng bên trong. Hàm bên trong là một hà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 các nhà máy chức năng 38 144 là một hàm bên trong, được xác định bên trong 145. Lưu ý rằng bạn có quyền truy cập vào 146 bên trong 144, trong khi 144 không được xác định bên ngoài 145>>> 39Thay vào đó, bạn sử dụng 145 để tạo các hàm số nhân mới, mỗi hàm dựa trên một yếu tố khác nhau>>> 80Tương tự, bạn có thể sử dụng các chức năng bên trong để tạo trang trí. Hãy nhớ rằng, một trình trang trí là một hàm trả về một hàm 81 151 là một công cụ trang trí, bởi vì nó là một hàm mong đợi một hàm, 152, làm đối số duy nhất của nó và trả về một hàm khác, 153. Lưu ý cấu trúc của chính 151
Mẫu này là phổ biến để xác định trang trí. Các phần thú vị là những phần xảy ra bên trong chức năng bên trong
dùng thử. 168 là một hàm trả về từ 169. Xem điều gì xảy ra nếu nó tăng gấp ba lần>>> 82Nhâ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 đó, 169 lặp lại ba lần. Việc trang trí diễn ra tại 171Cảm giác hơi rắc rối khi cứ lặp đi lặp lại 172. 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 trình trang trí. Định nghĩa sau đây của 168 giống như định nghĩa ở trên>>> 83Biểu tượng 174 được sử dụng để áp dụng trang trí. Trong trường hợp này, 175 có nghĩa là 151 được áp dụng cho hàm được xác định ngay sau nóMột trong số ít decorator được định nghĩa trong thư viện chuẩn là 177. Điều này khá hữu ích khi xác định các trang trí của riêng bạn. Vì các công cụ trang trí thay thế một chức năng này bằng một chức năng khác một cách hiệu quả nên chúng tạo ra một vấn đề tế nhị với các chức năng của bạn>>> 84 175 tô điểm cho 168, sau đó được thay thế bằng hàm bên trong 153, như đầu ra ở trên xác nhận. Điều này cũng sẽ thay thế tên, chuỗi tài liệu và siêu dữ liệu khác. Thông thường, điều này sẽ không có nhiều tác dụng, nhưng nó có thể gây khó khăn cho việc xem xét nội tâm.Đôi khi, các chức năng được trang trí phải có siêu dữ liệu chính xác. 177 khắc phục chính xác vấn đề này 85Với định nghĩa mới này của 175, siêu dữ liệu được giữ nguyên>>> 86Lưu ý rằng 168 hiện vẫn giữ tên riêng của nó, ngay cả sau khi được trang trí. Đó là hình thức tốt để sử dụng 177 bất cứ khi nào bạn xác định một người trang trí. Một kế hoạch chi tiết mà bạn có thể sử dụng cho hầu hết các nhà trang trí của mình là như sau 87Để xem thêm ví dụ về cách xác định trình trang trí, hãy xem các ví dụ được liệt kê trong Primer on Python Decorators Loại bỏ các quảng cáoTạo Trình trang trí bộ hẹn giờ PythonTrong phần này, bạn sẽ tìm hiểu cách mở rộng bộ hẹn giờ Python của mình để bạn cũng có thể sử dụng nó làm công cụ trang trí. Tuy nhiên, ở bài tập đầu tiên, bạn sẽ tạo một bộ trang trí bộ hẹn giờ Python từ đầu Dựa trên bản thiết kế ở trên, bạn chỉ cần quyết định những việc cần làm trước và sau khi gọi hàm trang trí. Điều này tương tự như những cân nhắc về những việc cần làm khi vào và thoát khỏi trình quản lý bối cảnh. Bạn muốn bắt đầu bộ hẹn giờ Python trước khi gọi chức năng được trang trí và dừng bộ hẹn giờ Python sau khi cuộc gọi kết thúc. Bạn có thể định nghĩa một trình trang trí 185 như sau 88Lưu ý bao nhiêu 186 giống với mẫu trước đó mà bạn đã thiết lập để định thời gian cho mã Python. Bạn có thể áp dụng 185 như sau>>> 89Nhớ lại rằng bạn cũng có thể áp dụng một trình trang trí cho một chức năng đã xác định trước đó >>> 30Bởi vì 174 áp dụng khi các chức năng được xác định, bạn cần sử dụng biểu mẫu cơ bản hơn trong những trường hợp này. Một lợi thế của việc sử dụng trình trang trí là bạn chỉ cần áp dụng nó một lần và nó sẽ tính thời gian cho chức năng mỗi lần>>> 31 185 thực hiện công việc. Tuy nhiên, theo một nghĩa nào đó, bạn đang quay trở lại hình vuông, vì 185 không có bất kỳ sự linh hoạt hoặc tiện lợi nào của 28. Bạn cũng có thể làm cho lớp 28 của mình hoạt động như một người trang trí không?Cho đến giờ, bạn đã sử dụng các bộ trang trí như các chức năng được áp dụng cho các chức năng khác, nhưng điều đó không hoàn toàn đúng. Trang trí phải được callables. Có nhiều loại có thể gọi được trong Python. Bạn có thể làm cho các đối tượng của riêng mình có thể gọi được bằng cách định nghĩa phương thức đặc biệt 193 trong lớp của chúng. Hàm và lớp sau hoạt động tương tự>>> 32Ở đây, 194 là một thể hiện có thể gọi được và có thể bình phương số, giống như hàm 195 trong ví dụ đầu tiênĐiều này cung cấp cho bạn một cách để thêm các khả năng của trình trang trí vào lớp 28 hiện có 33 193 sử dụng thực tế rằng 28 đã là trình quản lý bối cảnh để tận dụng các tiện ích mà bạn đã xác định ở đó. Đảm bảo rằng bạn cũng nhập 199 ở đầu 40Bây giờ bạn có thể sử dụng 28 làm công cụ trang trí>>> 34Trước khi kết thúc phần này, hãy biết rằng có một cách đơn giản hơn để biến bộ hẹn giờ Python của bạn thành một bộ trang trí. Bạn đã thấy một số điểm tương đồng giữa trình quản lý ngữ cảnh và trình trang trí. Cả hai thường được sử dụng để làm điều gì đó trước và sau khi thực thi một số mã nhất định Dựa trên những điểm tương đồng này, có một lớp mixin được định nghĩa trong thư viện chuẩn có tên là 302. Bạn có thể thêm các khả năng trang trí vào các lớp trình quản lý ngữ cảnh của mình chỉ bằng cách kế thừa 302 35Khi bạn sử dụng 302 theo cách này, bạn không cần phải tự triển khai 193, vì vậy bạn có thể xóa nó khỏi lớp 28 một cách an toànLoại bỏ các quảng cáoSử dụng Trình trang trí bộ hẹn giờ PythonTiếp theo, bạn sẽ làm lại ví dụ 10 lần cuối, sử dụng bộ đếm thời gian Python làm công cụ trang trí 36Nếu bạn so sánh cách triển khai này với cách triển khai ban đầu không tính thời gian, thì bạn sẽ nhận thấy rằng sự khác biệt duy nhất là việc nhập 28 trên dòng 3 và ứng dụng của 309 trên dòng 6. Một lợi thế đáng kể của việc sử dụng các công cụ trang trí là chúng thường dễ áp dụng, như bạn thấy ở đâyTuy nhiên, decorator 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 cần thiết để in hướng dẫn, ngoài thời gian tải xuống. Chạy tập lệnh lần cuối 37Vị 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 cũng đang xem xét thời gian 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 28 làm công cụ trang trí, bạn sẽ thấy những lợi ích tương tự như bạn đã làm với trình quản lý ngữ cảnh
Tuy nhiên, trình trang trí không linh hoạt như trình quản lý ngữ cảnh. Bạn chỉ có thể áp dụng chúng để hoàn thành chức năng. Có thể thêm các bộ trang trí vào các chức năng đã được xác định, nhưng điều này hơi rắc rối 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ộ hẹn giờ Python của mình Mã nguồn đầy đủ của hẹn giờ. pyHiện/Ẩn 38Mã này cũng có sẵn trong kho lưu trữ 29 trên GitHubBạn có thể tự mình sử dụng mã bằng cách lưu mã vào tệp có tên 40 và nhập mã vào chương trình của mình>>> 39 28 cũng có sẵn trên PyPI, vì vậy một tùy chọn thậm chí còn dễ dàng hơn là cài đặt nó bằng cách sử dụng 08 3Lưu ý rằng tên gói trên PyPI là 29. Bạn sẽ cần sử dụng tên này cả khi bạn cài đặt gói và khi bạn nhập 28>>> 61Ngoài tên và một số tính năng bổ sung, 317 hoạt động chính xác như 318. Tóm lại, bạn có thể sử dụng 28 theo ba cách khác nhau
Loại bộ đếm thời gian Python này chủ yếu hữu ích để theo dõi thời gian mà mã của bạn dành cho các hàm hoặc khối mã khóa riêng lẻ. Trong phần tiếp theo, bạn sẽ có tổng quan nhanh về các lựa chọn thay thế mà bạn có thể sử dụng nếu muốn tối ưu hóa mã của mình Loại bỏ các quảng cáoCác chức năng hẹn giờ Python khácCó nhiều tùy chọn để định thời gian mã của bạn với Python. Trong hướng dẫn này, bạn đã học cách tạo 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. Tìm kiếm nhanh trên PyPI cho thấy đã có nhiều dự án cung cấp 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 cả lý do tại sao nên dùng 6. Sau đó, bạn sẽ khám phá các giải pháp thay thế để tối ưu hóa mã của mình mà 28 không phù hợpSử dụng các hàm hẹn giờ Python thay thếBạn đã sử dụng 6 trong suốt hướng dẫn này để thực hiện các phép đo thời gian thực tế, nhưng thư viện 4 của Python đi kèm với một số chức năng khác cũng đo thời gian. Đây là một số lựa chọn
Một lý do để có nhiều hàm là Python biểu thị thời gian dưới dạng 328. Các số dấu phẩy động không chính xác về bản chất. Bạn có thể đã thấy kết quả như thế này trước đây>>> 65 328 của Python tuân theo Tiêu chuẩn IEEE 754 cho Số học dấu phẩy động, tiêu chuẩn này cố gắng biểu diễn tất cả các số dấu phẩy động trong 64 bit. Vì có vô số số dấu phẩy động nên bạn không thể biểu diễn tất cả chúng bằng một số bit hữu hạnIEEE 754 quy định một hệ thống có mật độ số mà bạn có thể biểu diễn thay đổi. Bạn càng gần một, bạn càng có thể đại diện cho nhiều số hơn. Đối với các số lớn hơn, sẽ có nhiều khoảng cách hơn giữa các số mà bạn có thể biểu thị. Điều này có một số hậu quả khi bạn sử dụng 328 để biểu thị thời gianXem xét 8. Mục đích chính của chức năng này là để đại diện cho thời gian thực tế ngay bây giờ. Nó thực hiện điều này dưới dạng số giây kể từ một thời điểm nhất định, được gọi là kỷ nguyên. Số được trả về bởi 8 khá lớn, có nghĩa là có ít số hơn và độ phân giải bị ảnh hưởng. Cụ thể, 8 không thể đo chênh lệch nano giây>>> 66Một nano giây là một phần tỷ giây. Lưu ý rằng việc thêm một nano giây vào 112 không ảnh hưởng đến kết quả. Mặt khác, 6 sử dụng một số thời điểm không xác định làm kỷ nguyên của nó, cho phép nó hoạt động với số lượng nhỏ hơn và do đó có được độ phân giải tốt hơn>>> 67Ở đây, bạn nhận thấy rằng việc thêm một nano giây vào 336 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 8, hãy xem Hướng dẫn dành cho người mới bắt đầu về Mô-đun thời gian PythonNhững thách thức với việc biểu diễn thời gian dưới dạng 328 đã được biết rõ, vì vậy Python 3. 7 đã giới thiệu một tùy chọn mới. Mỗi hàm đo lường 4 hiện có một hàm 00 tương ứng trả về số nano giây dưới dạng 341 thay vì số giây dưới dạng 328. Chẳng hạn, 8 hiện có một bản sao nano giây có tên là 344>>> 68Số nguyên không bị chặn trong Python, vì vậy điều này cho phép 344 cung cấp độ phân giải nano giây vĩnh viễn. Tương tự, 01 là một biến thể nano giây của 6>>> 69Vì 6 đã cung cấp độ phân giải nano giây, nên có ít lợi thế hơn khi sử dụng 01Ghi chú. 01 chỉ khả dụng trong Python 3. 7 trở lên. Trong hướng dẫn này, bạn đã sử dụng 6 trong lớp 28 của mình. Bằng cách đó, bạn cũng có thể sử dụng 28 trên các phiên bản Python cũ hơnĐể biết thêm thông tin về các hàm 00 trong 4, hãy xem Các tính năng mới thú vị trong Python 3. 7Có hai chức năng trong 4 không đo thời gian ngủ. Đây là 7 và 9, hữu ích trong một số cài đặt. Tuy nhiên, đối với 28, bạn thường muốn đo toàn bộ thời gian dành cho. Chức năng cuối cùng trong danh sách trên là 5. Cái tên ám chỉ chức năng này là một bộ đếm thời gian đơn điệu, là bộ đếm thời gian Python không bao giờ có thể di chuyển lùiTất cả các chức năng này đều đơn điệu ngoại trừ 8, có thể quay ngược lại nếu thời gian hệ thống được điều chỉnh. Trên một số hệ thống, 5 có cùng chức năng với 6 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 364 để biết thêm thông tin về chức năng hẹn giờ Python>>> 00Kết quả có thể khác 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ể thấy, 6 thường là lựa chọn tốt nhất cho bộ đếm thời gian Python của bạnLoại bỏ các quảng cáoƯớc tính thời gian chạy với 1# timer.py 2 3import time 4 5class TimerError(Exception): 6 """A custom exception used to report errors in use of Timer class""" 7 8class Timer: 9 def __init__(self): 10 self._start_time = None 11 12 def start(self): 13 """Start a new timer""" 14 if self._start_time is not None: 15 raise TimerError(f"Timer is running. Use .stop() to stop it") 16 17 self._start_time = time.perf_counter() 18 19 def stop(self): 20 """Stop the timer, and report the elapsed time""" 21 if self._start_time is None: 22 raise TimerError(f"Timer is not running. Use .start() to start it") 23 24 elapsed_time = time.perf_counter() - self._start_time 25 self._start_time = None 26 print(f"Elapsed time: {elapsed_time:0.4f} seconds") 369Giả sử bạn đang cố gắng vắt kiệt phần hiệu suất cuối cùng ra khỏi mã của mình và bạn đang băn khoăn về cách hiệu quả nhất để chuyển đổi danh sách thành tập hợp. Bạn muốn so sánh bằng cách sử dụng 370 và bộ chữ, 371. Bạn có thể sử dụng bộ đếm thời gian Python của mình cho việc này>>> 01Thử nghiệm này dường như chỉ ra rằng bộ chữ 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ả rất khác. Đó là bởi vì bạn chỉ thử mã một lần. Chẳng hạn, bạn có thể gặp xui xẻo và chạy tập lệnh ngay khi máy tính của bạn đang bận rộn với các tác vụ khác Cách tốt hơn là sử dụng thư viện chuẩn 369. Nó được thiết kế chính xác để đo thời gian thực thi của các đoạn mã nhỏ. Mặc dù bạn có thể nhập và gọi 373 từ Python như một chức năng thông thường, nhưng việc sử dụng giao diện dòng lệnh thường thuận tiện hơn. Bạn có thể tính thời gian cho hai biến thể như sau 02 369 tự động gọi mã của bạn nhiều lần để lấy trung bình các phép đo nhiễu. Kết quả từ 369 xác nhận rằng bộ chữ nhanh hơn 370Ghi chú. Hãy cẩn thận khi bạn đang sử dụng 369 trên mã có thể tải tệp xuống hoặc truy cập cơ sở dữ liệu. Vì 369 tự động gọi chương trình của bạn nhiều lần, nên bạn có thể vô tình gửi thư rác cho máy chủ bằng các yêu cầuCuối cùng, shell tương tác IPython và Jupyter Notebook có hỗ trợ thêm cho chức năng này với lệnh ma thuật 379>>> 03Một lần nữa, các phép đo chỉ ra rằng sử dụng một bộ chữ sẽ nhanh hơn. Trong Jupyter Notebooks, bạn cũng có thể sử dụng phép thuật ô 380 để đo thời gian chạy toàn bộ ôTìm nút cổ chai trong mã của bạn với Profilers 369 là lựa chọn tuyệt vời để đo điểm chuẩn cho một đoạn mã cụ thể. Tuy nhiên, sẽ rất cồng kềnh nếu sử dụng nó để kiểm tra tất cả các phần trong chương trình của bạn và xác định phần nào chiếm nhiều thời gian nhất. Thay vào đó, bạn có thể sử dụng một hồ sơ 382 là một 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ù cách đơn giản nhất là sử dụng nó như một công cụ dòng lệnh 04Lệnh này chạy 10 với cấu hình được bật. Bạn lưu đầu ra từ 382 trong 385, như được chỉ định bởi tùy chọn 386. 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 chuẩn. Chạy mô-đun 387 trên tệp 388 của bạn sẽ mở trình duyệt thống kê hồ sơ tương tác 05Để sử dụng 387, bạn gõ lệnh tại dấu nhắc. Tại đâ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 390 và 391. Để có được đầu ra sạch hơn, 392 có thể hữu ích 06Đầ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 mà 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 ( 393), có nghĩa là mã của bạn tính thời gian khi hàm đã cho gọi một hàm khácBạn có thể thấy rằng mã của bạn hầu như dành toàn bộ thời gian bên trong mô-đun 394 và đặc biệt là bên trong 395. Mặc dù đây có thể là xác nhận hữu ích về những gì bạn đã biết, nhưng sẽ thú vị hơn khi tìm thấy nơi mã của bạn thực sự dành thời gianCột tổng thời gian ( 396) cho biết lượng thời gian mã của bạn dành cho một chức năng, 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 cho việc này. Để tìm nơi mã dành phần lớn thời gian, hãy đưa ra một lệnh 390 khác 07Bây giờ bạn có thể thấy rằng 10 thực sự dành phần lớn thời gian để làm việc với socket hoặc xử lý dữ liệu bên trong 399. Cái sau là một trong những phần phụ thuộc của Real Python Reader được sử dụng để phân tích nguồn cấp dữ liệu hướng dẫnBạn có thể sử dụng 387 để biết phần nào mã của bạn dành phần lớn thời gian ở đâu và sau đó cố gắng tối ưu hóa bất kỳ tắc nghẽn nào bạn tìm thấy. Bạn cũng có thể sử dụng công cụ này để hiểu rõ hơn về cấu trúc mã của mình. Chẳng hạn, các lệnh 801 và 802 sẽ cho bạn biết hàm nào gọi và được gọi bởi một hàm đã choBạn cũng có thể điều tra các chức năng nhất định. Kiểm tra bao nhiêu chi phí mà 28 gây ra bằng cách lọc kết quả bằng cụm từ 804 08May mắn thay, 28 chỉ gây ra chi phí tối thiểu. Sử dụng 806 để thoát khỏi trình duyệt 387 khi bạn điều tra xongĐể có giao diện mạnh mẽ hơn vào dữ liệu hồ sơ, hãy xem KCacheGrind. Nó sử dụng định dạng dữ liệu riêng, nhưng bạn có thể chuyển đổi dữ liệu từ 382 bằng cách sử dụng 809 09Lệnh này sẽ chuyển đổi 385 và mở KCacheGrind để phân tích dữ liệuTùy chọn cuối cùng mà bạn sẽ thử ở đây để định thời gian cho mã của mình là 811. 382 có thể cho bạn biết chức năng nào mà mã của bạn dành nhiều thời gian nhất, nhưng nó sẽ không cung cấp cho bạn thông tin chi tiết về dòng nào bên trong chức năng đó là chậm nhất. Đó là nơi mà 811 có thể giúp bạnGhi chú. Bạn cũng có thể định cấu hình mức tiêu thụ bộ nhớ của mã của mình. Điều này nằm ngoài phạm vi của hướng dẫn này. Tuy nhiên, bạn có thể xem 814 nếu bạn cần theo dõi mức tiêu thụ bộ nhớ của các chương trình của mìnhLưu ý rằng cấu hình dòng cần có thời gian và thêm một chút chi phí hợp lý vào thời gian chạy của bạn. Quy trình làm việc thông thường trước tiên là sử dụng 382 để xác định chức năng nào cần điều tra, sau đó chạy 811 trên các chức năng đó. 811 không phải 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 hướng dẫn cài đặt để thiết lậpTrước khi bạn chạy trình cấu hình, bạn cần cho nó biết chức năng nào cần cấu hình. Bạn làm điều này bằng cách thêm một trình trang trí 818 bên trong mã nguồn của bạn. Ví dụ: với hồ sơ 819, bạn thêm phần sau vào bên trong 40 0Lưu ý rằng bạn không nhập 821 ở bất cứ đâu. Thay vào đó, nó sẽ tự động được thêm vào không gian tên chung khi bạn chạy trình lược tả. Tuy nhiên, bạn cần xóa dòng này khi hoàn tất hồ sơ. Nếu không, bạn sẽ nhận được một 822Tiếp theo, chạy trình lược tả bằng cách sử dụng 823, đây là một phần của gói 811 1Lệnh này sẽ tự động lưu dữ liệu hồ sơ trong một tệp có tên là 825. Bạn có thể xem những kết quả đó bằng cách sử dụng 811 2Đầu tiên, lưu ý rằng đơn vị thời gian trong báo cáo này là micro giây ( 827). Thông thường, số dễ truy cập nhất để xem là 828, cho bạn biết tỷ lệ phần trăm tổng thời gian mã của bạn sử dụng bên trong một hàm tại 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 cho dòng 47, đây là dòng định dạng và in kết quả của bộ đếm thời gianPhần 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 mình
Bạn cũng đã biết lý do tại sao bạn nên ưu tiên dùng 3 hơn là dùng 833 khi đo điểm chuẩn cho mã, cũng như các giải pháp thay thế khác hữu ích khi bạn tối ưu hóa mã của mìnhBây giờ bạn có thể thêm các hàm hẹn giờ Python vào mã của riêng mình. Theo dõi chương trình của bạn chạy nhanh như thế nào trong nhật ký sẽ giúp bạn theo dõi các tập lệnh của mình. Bạn có ý tưởng nào cho các trường hợp sử dụng khác trong đó các lớp, trình quản lý ngữ cảnh và trình trang trí kết hợp tốt với nhau không? Tài nguyênĐể tìm hiểu sâu hơn về các chức năng hẹn giờ của Python, hãy xem các tài nguyên này
Đánh dấu là đã hoàn thành 🐍 Thủ thuật Python 💌 Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python Gửi cho tôi thủ thuật Python » Giới thiệu về Geir Arne Hjelle Geir Arne là một Pythonista cuồng nhiệt và là thành viên của nhóm hướng dẫn Real Python » Thông tin thêm về Geir ArneMỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là Aldren Đan Jaya Joanna kate Mike Philipp Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia Nâng cao kỹ năng Python của bạn » Bậc thầy Kỹ năng Python trong thế giới thực Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia Nâng cao kỹ năng Python của bạn » Bạn nghĩ sao? Đánh giá bài viết này Tweet Chia sẻ Chia sẻ EmailBài học số 1 hoặc điều yêu thích mà bạn đã học được là gì? Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. Nhận các mẹo để đặt câu hỏi hay và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi Thời gian được tính bằng Python như thế nào?Để tính thời gian thực thi mã, mô-đun thời gian có thể được sử dụng. . Lưu dấu thời gian ở đầu mã bắt đầu sử dụng time() Lưu dấu thời gian ở cuối mã Tìm sự khác biệt giữa kết thúc và bắt đầu, cho biết thời gian thực hiện %% thời gian có nghĩa là gì trong Python?%%time là một lệnh kỳ diệu. Nó là một phần của IPython. %%time in thời gian treo tường cho toàn bộ ô trong khi %time chỉ cho bạn thời gian cho dòng đầu tiên. Sử dụng %%time hoặc %time in 2 giá trị. Thời gian CPU. |