2013-07-10 10 views
10

Đôi khi, tôi thích thời gian phải mất bao lâu các phần mã của tôi chạy. Tôi đã kiểm tra rất nhiều trang web trực tuyến và đã thấy, nói chung, hai cách chính để thực hiện việc này. Một người đang sử dụng time.time và người kia đang sử dụng timeit.timeit.time.time vs. timeit.timeit

Vì vậy, tôi đã viết một kịch bản rất đơn giản để so sánh hai:

from timeit import timeit 
from time import time 
start = time() 
for i in range(100): print('ABC') 
print(time()-start, timeit("for i in range(100): print('ABC')", number=1)) 

Về cơ bản, nó lần phải mất bao lâu để in "ABC" 100 lần trong một vòng lặp for. Số bên trái là các kết quả cho time.time và số bên phải là cho timeit.timeit:

# First run 
0.0 0.012654680972022981 
# Second run 
0.031000137329101562 0.012747430190149865 
# Another run 
0.0 0.011262325239660349 
# Another run 
0.016000032424926758 0.012740166697164025 
# Another run 
0.016000032424926758 0.0440628627381413 

Như bạn thấy, đôi khi, time.time là nhanh hơn và đôi khi nó là chậm hơn. Đó là cách tốt hơn (chính xác hơn)?

+6

'timeit' là lựa chọn tốt hơn cho các đoạn mã thời gian. Nó sử dụng 'time.time()' ('time.clock()' cho Windows) và vô hiệu hóa bộ thu gom rác. Ngoài ra, một thử nghiệm không thực sự đủ. – Blender

+0

@Blender: 'timeit' sử dụng' time.perf_counter' bằng Python 3.3+ – jfs

+0

@ J.F.Sebastian: Cảm ơn, tôi không biết điều đó. – Blender

Trả lời

25

timeit là chính xác hơn, vì ba lý do:

  • nó lặp đi lặp lại các bài kiểm tra nhiều lần để loại bỏ ảnh hưởng của các nhiệm vụ khác trên máy tính của bạn, chẳng hạn như đỏ bừng đĩa và lập kế hoạch OS.
  • nó vô hiệu hóa bộ thu gom rác để ngăn chặn quá trình đó làm lệch kết quả bằng cách lên lịch một bộ sưu tập chạy tại thời điểm không thích hợp.
  • nó chọn bộ hẹn giờ chính xác nhất cho hệ điều hành của bạn, time.time hoặc time.clock bằng Python 2 và time.perf_counter() trên Python 3. Xem timeit.default_timer.
+0

Nếu bạn làm rõ ba điều đó, bạn sẽ nhận được kết quả chính xác như thời gian chờ? Trường hợp sử dụng của tôi đang chạy nhiều thử nghiệm với các yếu tố đầu vào khác nhau, vì vậy hình nó có thể dễ dàng hơn để phân phối với thời gian. – Annan

+1

@Annan: Tại sao tái tạo lại bánh xe này? Tôi chắc chắn rằng bất cứ điều gì usecase bạn có thể đến với, miễn là bạn hiểu những gì nó có nghĩa là để chạy một cái gì đó nhiều lần, có thể được cung cấp bởi 'timeit'. Có một vài thủ thuật nhỏ hơn 'timeit' sử dụng (chẳng hạn như sử dụng' itertools.repeat (None, repetitioncount) 'cho một phạm vi lặp lại ma sát thấp) mà bạn phải lặp lại nếu bạn muốn là 'chính xác' như 'timeit' được. –

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