2013-03-02 38 views
6

Tôi muốn thời gian một đoạn mã của tôi, và tôi muốn chỉ là thời gian thực hiện CPU (bỏ qua quá trình hệ điều hành, vv).Định thời gian CPU của chương trình python?

Tôi đã thử time.clock(), nó xuất hiện quá thiếu chính xác và đưa ra một câu trả lời khác nhau mỗi lần. (Trong lý thuyết chắc chắn nếu tôi chạy nó một lần nữa cho cùng một đoạn mã nó sẽ trả về cùng một giá trị ??)

Tôi đã chơi với thời gian khoảng một giờ. Về cơ bản những gì giết nó cho tôi là quá trình "thiết lập", tôi sẽ phải nhập khoảng 20 chức năng không thực tế vì tôi đang viết lại mã của mình vào phần thiết lập để thử và sử dụng nó.

Cprofiles trông hấp dẫn hơn, nhưng chúng có trả lại thời gian CPU không? cũng là một điểm nhỏ - nó tạo ra quá nhiều thông tin. Có cách nào để có được thông tin outputted vào một tập tin txt hoặc .dat vì vậy tôi thực sự có thể đọc nó?

Cheers

OS: Chương trình Ubuntu: python 2.7

+2

Lưu ý rằng bạn sẽ nhận được thời gian khác nhau cho mỗi lần chạy, ngay cả khi bạn muốn tính chu kỳ CPU chỉ được thực hiện bởi quy trình của bạn. Điều này là do bộ nhớ cache CPU, mà sẽ kết thúc ở trạng thái khác nhau (có phần khác nhau của không gian địa chỉ của bạn) mỗi lần. Bộ nhớ cache CPU được chia sẻ giữa các quá trình, vì vậy bạn không thể đảm bảo rằng ví dụ mỗi lần bạn chạy mã của mình, một biến nhất định sẽ được lưu trong bộ nhớ cache. – liori

+0

[resource.getrusage] (http://docs.python.org/2/library/resource.html) có thể được sử dụng để có được thời gian xử lý trong python 2.7 – Annan

Trả lời

7

Có vẻ như bạn đang tìm kiếm một cách để thời gian quá trình toàn thời gian thực hiện, điều tốt nhất bạn có thể làm là sử dụng timeit.default_timer() mà cung cấp hàm time.clock() hoặc time.time() chính xác nhất hiện có trên nền tảng hiện tại, nhưng nó là toàn hệ thống thời gian, có nghĩa là các proceses khác có thể can thiệp vào các phép đo của bạn.

Dưới đây là các thông tin từ các tài liệu của timeit.default_timer():

Xác định một bộ đếm thời gian mặc định, một cách nền tảng cụ thể. Trên Windows, time.clock() có độ chi tiết cực nhỏ, nhưng time.time() ‘s độ chi tiết là 1/60 giây. Trên Unix, time.clock() có 1/100th độ chi tiết thứ hai và time.time() chính xác hơn nhiều. Trên nền tảng, default_timer() đo thời gian đồng hồ treo tường, không phải CPU thời gian. Điều này có nghĩa là các quy trình khác chạy trên cùng một máy tính có thể gây trở ngại cho việc định thời gian.

Bạn nên thử kiểm tra các mô-đun c có thể có quyền truy cập vào apis thời gian khác nhau.


Cách tốt nhất có thể để làm điều này là sử dụng time.process_time() mà chỉ có sẵn trong python 3.3 và lên, đây là thông tin từ các tài liệu:

Return giá trị (tính bằng giây phân đoạn) của tổng số của hệ thống và thời gian sử dụng CPU của quy trình hiện tại. Nó không bao gồm thời gian trôi qua trong khi ngủ. Đó là toàn bộ quá trình theo định nghĩa. Điểm tham chiếu của giá trị trả lại là không xác định, do đó chỉ có sự khác biệt giữa kết quả của các cuộc gọi liên tiếp là hợp lệ.

+4

Câu trả lời hay, nhưng 'process_time' chỉ có sẵn trong Python 3.3 và sau đó, anh ấy đang sử dụng 2,7. – omz

+0

Chết tiệt bạn đúng là – Shedokan

+3

'timeit.default_timer()' là 'time.perf_counter()' trên Python 3.3+. Đây là ['time.process_time()' và 'time.perf_counter()' cho Python 2 trên Ubuntu.] (Https://gist.github.com/zed/5073409) – jfs

3

Thay vì time.clock(), hãy sử dụng timeit.default_timer(); nó sử dụng tùy chọn chính xác nhất cho nền tảng của bạn.Đối với Ubuntu, ví dụ, điều này sẽ sử dụng time.time() thay thế.

Khi sử dụng timeit, hãy tạo một chức năng thiết lập để bạn có thể sử dụng lại cho timeit. Có, điều này trông giống như một chút công việc nhưng nó đảm bảo rằng bạn thời gian những gì bạn thực sự muốn đo lường, và không bao gồm mã thiết lập trong phần đo thời gian quan trọng.

Các vấn đề liên quan