2009-08-10 26 views
14

Khi tôi chạy mã bên dưới timeit(), nó xuất hiện để hoàn thành ngay lập tức. Tuy nhiên khi tôi chạy nó trong hàm timeit(), nó mất nhiều thời gian hơn. Tại sao?python: slow timeit() function

>>> import timeit 
>>> t = timeit.Timer("3**4**5") 
>>> t.timeit() 
16.55522028637718 

Sử dụng: Python 3.1 (x86) - AMD Athlon 64 X2 - WinXP (32 bit)

+0

Phân trang Alex Martelli, Alex Martelli, vui lòng nhận xét về mô-đun thời gian trăn ... – hughdbrown

+0

RichieHindle đã nhận được ngay khi tôi ngoại tuyến. Và, tôi luôn luôn sử dụng "python -mtimeit" anyway, không bao giờ timeit trong thông dịch viên tương tác hoặc một chương trình ;-) –

Trả lời

26

Chức năng timeit() chạy mã nhiều lần (mặc định một triệu) và mất trung bình thời gian.

Để chạy mã chỉ một lần, làm như sau:

t.timeit(1) 

nhưng điều đó sẽ cho bạn kết quả sai lệch - nó lặp đi lặp lại cho lý do chính đáng.

Để có thời gian lặp lại cho phép lặp lại, hãy chia kết quả theo số vòng lặp. Sử dụng giá trị nhỏ hơn cho số lần lặp lại nếu một triệu là quá nhiều:

count = 1000 
print t.timeit(count)/count 
+6

Đúng! Tôi cũng khuyên bạn nên sử dụng 'python -mtimeit' từ dòng lệnh thay vì timeit như một mô-đun - phiên bản dòng lệnh có quá nhiều thứ nhỏ mà bạn không nhận được từ mô-đun (lặp lại một số lần khác nhau tùy thuộc vào cách thức chậm/nhanh là những gì bạn đang đo lường, ví dụ: một kỹ thuật tuyệt vời microbenchmarking, đáng tiếc các mô-đun không cung cấp nó - vv, vv ;-). –

+0

@Alex Nhận xét của bạn ở đây không rõ ràng đối với tôi. Bạn có thể làm rõ những chức năng bổ sung nào có sẵn trên CLI không. – Tshepang

+1

@Tshepang: CLI sử dụng timeit chọn số lần lặp lại "kỳ diệu" - ít cho mã chậm được đo, nhiều hơn cho mã nhanh hơn, rất nhiều cho mã rất nhanh - độ chính xác cân bằng độc đáo và thời gian cần để có được kết quả. –

6

Vì thời gian mặc định chạy nó một triệu lần. Vấn đề là để làm vi điểm chuẩn, và cách duy nhất để có được thời gian chính xác của các sự kiện ngắn là lặp lại chúng nhiều lần.

3

Theo số docs, Timer.timeit() chạy mã của bạn một triệu lần theo mặc định. Sử dụng thông số "số" để thay đổi thông số mặc định này:

t.timeit(number=100) 

chẳng hạn.

2

Timeit chạy cho một triệu vòng theo mặc định.

Bạn cũng có thể có thứ tự các sự cố hoạt động: (3**4)**5 != 3**4**5.

+0

Cảm ơn tất cả mọi người. Rất hữu ích. Và có, đó là thứ tự dự định của các hoạt động. –