Trong khi chuẩn bị viết loạt Python viết nhanh hơn, vấn đề đầu tiên tôi gặp phải là "Làm cách nào để điểm chuẩn một đoạn mã theo một cách khách quan nhưng không phức tạp". Show Tôi có thể chạy Vì vậy, đây là một vài công cụ và kỹ thuật khác nhau tôi đã thử. Vào cuối bài viết, tôi sẽ cho bạn biết tôi đã chọn cái nào và tại sao. Thêm vào đó, tôi sẽ cung cấp cho bạn một số quy tắc ngón tay cái khi mỗi công cụ có thể tiện dụng. Python -M TimeitCách dễ nhất để đo lường thời gian mất bao lâu để chạy một số mã là sử dụng mô -đun thời gian. Bạn có thể viết
Tuy nhiên, cách tiếp cận
Việc nhập khẩu sẽ mất phần lớn thời gian trong quá trình chuẩn. Nhưng có lẽ bạn không muốn điểm chuẩn mất bao lâu để nhập các mô -đun. Bạn muốn xem mất bao lâu để thực hiện một số chức năng từ mô -đun đó. Python -M Timeit -S "Cài đặt mã"Để tách mã thiết lập khỏi điểm chuẩn, TimeIT hỗ trợ tham số 0. Bất cứ mã nào bạn chuyển ở đây sẽ được thực thi nhưng sẽ không phải là một phần của điểm chuẩn. Vì vậy, chúng tôi có thể cải thiện mã trên và chạy nó như thế này: 1.Python -M Timeit -s "Cài đặt mã" -N 10000Chúng tôi có thể nghiêm ngặt hơn một chút và quyết định thực hiện mã của chúng tôi cùng một số lần mỗi lần. Theo mặc định, nếu bạn không chỉ định tham số '-n' (hoặc-số), thời gian sẽ cố gắng chạy mã 1, 2, 5, 10, 20, ... cho đến khi tổng thời gian thực hiện vượt quá 0,2 giây . Một chức năng chậm sẽ được thực thi một lần, nhưng một chức năng rất nhanh sẽ chạy hàng ngàn lần. Nếu bạn nghĩ rằng việc thực thi các đoạn mã khác nhau một số lần khác nhau ảnh hưởng đến điểm chuẩn của bạn, bạn có thể đặt tham số này thành một số được xác định trước. DockerMột trong những vấn đề với điểm chuẩn chạy với Vì vậy, trong khi cố gắng tìm ra cách tránh tình huống này, tôi quyết định cố gắng chạy các điểm chuẩn của mình ở Docker. Tôi đã đưa ra giải pháp sau: 3Mã trên sẽ:
Và kết quả có vẻ phù hợp hơn so với không sử dụng Docker. Đánh dấu lại điểm chuẩn nhiều lần, tôi đã nhận được kết quả với độ lệch nhỏ hơn. Tôi vẫn có một sự sai lệch - một số lần chạy chậm hơn một chút và một số chạy nhanh hơn một chút. Tuy nhiên, đó là trường hợp cho các ví dụ mã ngắn (chạy dưới 1 giây). Đối với các ví dụ mã dài hơn (chạy ít nhất một vài giây), sự khác biệt giữa các lần chạy thậm chí là khoảng 5% (tôi đã thử nghiệm Docker với ví dụ về loại bong bóng của tôi từ việc nâng cấp bài viết phiên bản Python của bạn). Vì vậy, như một người bình luận cảnh giác đề nghị, Docker không thực sự giúp đỡ nhiều ở đây. Thư viện điểm chuẩn PythonTại một số điểm, bạn có thể quyết định rằng việc nhận được số "tốt nhất 5" mà thời gian trả về theo mặc định là không đủ. Điều gì sẽ xảy ra nếu tôi cần biết kịch bản bi quan nhất là gì (thời gian tối đa cần phải chạy mã của tôi)? Hoặc sự khác biệt giữa chạy chậm nhất và nhanh nhất? Điều này có phải là sự khác biệt lớn, và chức năng của tôi chạy trong một khoảng thời gian hoàn toàn không thể đoán trước? Hay nó nhỏ đến mức gần như không đáng kể? Có các công cụ điểm chuẩn tốt hơn cung cấp nhiều số liệu thống kê về mã của bạn. Ghế đóng băng phong phúCông cụ đầu tiên tôi kiểm tra là gói băng ghế phong phú được tạo bởi Anthony Shaw cùng với kho lưu trữ chống mẫu của anh ấy cho một cuộc nói chuyện Pycon. Công cụ nhỏ này có thể điểm chuẩn một tập hợp các tệp với các ví dụ mã khác nhau và trình bày kết quả trong một bảng được định dạng độc đáo. Mỗi điểm chuẩn sẽ so sánh hai hàm khác nhau và trình bày giá trị trung bình, tối thiểu và tối đa của kết quả, do đó bạn có thể dễ dàng thấy sự lây lan giữa các kết quả. pyperfNếu bạn cần một công cụ điểm chuẩn nâng cao hơn, có lẽ bạn không thể sai nếu bạn chọn công cụ chính thức được sử dụng bởi bộ điểm chuẩn Python Performance - một nguồn điểm chuẩn có thẩm quyền cho tất cả các triển khai Python. PYPERF là một công cụ đầy đủ với nhiều tính năng khác nhau, bao gồm hiệu chuẩn tự động, phát hiện kết quả không ổn định, theo dõi việc sử dụng bộ nhớ và các chế độ công việc khác nhau, tùy thuộc vào việc bạn muốn so sánh các đoạn mã khác nhau hoặc nhận một loạt các chỉ số cho một hàm. Hãy xem một ví dụ. Đối với các điểm chuẩn, tôi sẽ sử dụng một hàm đơn giản nhưng không hiệu quả để tính một khoản tiền của 1.000.000 số đầu tiên: 4.Đây là đầu ra từ mô -đun thời gian:
Và đây là đầu ra của 5:
Kết quả rất giống nhau, nhưng với tham số 6, chúng tôi đã nói với PYPERF lưu trữ kết quả điểm chuẩn trong tệp JSON, vì vậy bây giờ chúng tôi có thể phân tích chúng và nhận được nhiều thông tin hơn:
HyperfineVà trong trường hợp bạn muốn điểm chuẩn một số mã không phải là mã Python, luôn có siêu nhân có thể được sử dụng để đánh giá bất kỳ lệnh CLI nào. Hyperfine có một tập hợp các tính năng tương tự như PYPERF. Nó tự động thực hiện khởi động, xóa bộ đệm và phát hiện các ngoại lệ thống kê. Và tất cả những điều đó, với các thanh và màu sắc tiến bộ đẹp, chỉ làm cho đầu ra trông đẹp. Bạn có thể chạy nó cho một lệnh và nó sẽ trả về thông tin thông thường như giá trị trung bình, tối thiểu và thời gian tối đa, độ lệch chuẩn, số lần chạy, v.v. Một là nhanh hơn: thời gian là tốt ... đối với tôiCuối cùng, tôi đã chọn một cách điểm chuẩn rất đơn giản: 7. Tôi không phải sử dụng phương pháp điểm chuẩn hoàn hảo (nếu nó thậm chí tồn tại). . Điều đó là cần thiết nếu tôi là điểm chuẩn một đoạn mã và chia sẻ kết quả với thế giới. Tôi không thể sử dụng một phương pháp đo lường ngẫu nhiên, không hiệu quả để đo lường và cho bạn biết "đoạn mã này là xấu vì nó chạy trong 15 giây". Bạn có thể sử dụng một công cụ điểm chuẩn tốt hơn, chạy nó trên một máy tính mạnh mẽ và kết thúc với cùng một mã chạy trong 1,5 giây.So sánh hai đoạn mã là một câu chuyện khác nhau. Chắc chắn, một phương pháp điểm chuẩn tốt, đáng tin cậy là quan trọng. Nhưng cuối cùng, chúng tôi quan tâm đến sự khác biệt về tốc độ tương đối giữa các ví dụ mã. Nếu máy tính của tôi chạy "Ví dụ A" trong 10 giây và "Ví dụ B" trong 20 giây, nhưng máy tính của bạn sẽ chạy chúng trong 5 và 10 giây, cả hai chúng tôi đều có thể kết luận rằng "Ví dụ B" chậm gấp đôi. Sử dụng 8 là đủ tốt. Nó cho phép tôi tách mã thiết lập khỏi mã thực tế mà tôi muốn điểm chuẩn. Và nếu bạn muốn chạy các điểm chuẩn tương tự trên máy tính của bạn, bạn có thể làm điều này ngay lập tức. Bạn đã cài đặt 8 với phân phối Python. Bạn không phải cài đặt bất kỳ thư viện bổ sung nào hoặc thiết lập Docker.Điều quan trọng hơn nhiều so với công cụ chính xác nhất là cách bạn thiết lập điểm chuẩn của mình. Cẩn thận với cách bạn cấu trúc mã của mìnhĐiểm chuẩn chạy là phần dễ dàng. Phần khó khăn là nhớ viết mã của bạn theo cách không "gian lận". Khi tôi lần đầu tiên viết bài viết danh sách sắp xếp, tôi rất vui khi thấy 0 nhanh hơn rất nhiều so với 1. "OMG, tôi đã tìm thấy Chén Thánh sắp xếp trong Python" - tôi nghĩ. Sau đó, ai đó chỉ ra rằng 2 sắp xếp danh sách tại chỗ. Vì vậy, nếu tôi chạy điểm chuẩn của mình, lần lặp đầu tiên sẽ sắp xếp danh sách (chậm) và mỗi lần lặp tiếp theo sẽ sắp xếp một danh sách đã được sắp xếp (nhanh hơn nhiều). Tôi đã phải cập nhật bài viết của mình và bắt đầu chú ý nhiều hơn đến cách tôi tổ chức các điểm chuẩn của mình.Sự kết luậnTùy thuộc vào trường hợp sử dụng của bạn, bạn có thể đạt được một công cụ khác để đánh giá mã của bạn:
|