2011-12-23 26 views
22

Tôi đang đối mặt với một tình huống kỳ lạ mà tôi không thể giải thích. Đây là thời gian thử nghiệm của tôi để tạo ra một danh sách lớn các bộ dữ liệu:Sự không thống nhất giữa% thời gian và% thời gian trong IPython

In [1]: def get_list_of_tuples(): 
    ...:  return [(i,) for i in range(10**6)] 
    ...: 

In [2]: %time res = get_list_of_tuples() 
CPU times: user 0.93 s, sys: 0.08 s, total: 1.01 s 
Wall time: 0.98 s 

In [3]: %timeit res = get_list_of_tuples() 
1 loops, best of 3: 92.1 ms per loop 

Như bạn có thể thấy, việc tạo danh sách lớn các bộ dữ liệu này chỉ mất chưa đầy một giây. timeit báo cáo thời gian thực hiện là khoảng 0,1 giây. Tại sao lại có sự khác biệt lớn trong hai báo cáo?

(Thử nghiệm trên IPython 0.11, Python 2.6.5.)

+1

Bạn có nhận được kết quả tương tự nếu bạn chạy % timeit trước và% time second? – sth

+1

Nhận xét thú vị. Có, tôi nhận được kết quả tương tự với một lệnh đảo ngược thực hiện. – badzil

+0

Tôi không biết IronPython, vì vậy tôi không thể nói nhiều về '% time' hoặc'% timeit', nhưng tôi đoán là '% time' sẽ lặp lại kiểm tra thời gian 10 lần. –

Trả lời

29

Sự khác biệt chủ yếu là do "by default, timeit() temporarily turns off garbage collection during the timing".

Quay trở về thu gom rác thải kết quả tương tự với một hiển thị trong câu hỏi, tức là thời gian thực hiện thu gom rác là cường độ lớn hơn so với cái mà không:

In [1]: import timeit 

# Garbage collection on. 
In [2]: N = 10; timeit.timeit('[(i,) for i in range(10**6)]', 'gc.enable()', number=N)/N 
Out[2]: 0.74884700775146484 
# 749 ms per loop. 

# Garbage collection off. 
In [3]: N = 10; timeit.timeit('[(i,) for i in range(10**6)]', number=N)/N 
Out[3]: 0.15906109809875488 
# 159 ms per loop. 
3

Benoit,

Nếu tôi sử dụng Python 2.6.6 và IPython 0.10 sau đó tôi nhìn thấy câu trả lời tương tự như của bạn. Sử dụng Python 2.7.1 và 0.10.1 IPython tôi nhận được một cái gì đó hợp lý hơn:

% ipython 
Python 2.7.1 (r271:86832, Nov 3 2011, 16:23:57) 
Type "copyright", "credits" or "license" for more information. 

IPython 0.10.1 -- An enhanced Interactive Python. 

In [1]: def get_list_of_tuples(): 
    ...:  return [(i,) for i in range(10**6)] 
    ...: 

In [2]: %time res = get_list_of_tuples() 
CPU times: user 0.25 s, sys: 0.10 s, total: 0.35 s 
Wall time: 0.35 s 

In [3]: %timeit res = get_list_of_tuples() 
1 loops, best of 3: 215 ms per loop 
+0

Có kết quả rất giống với IPython 0.11 và Python 2.7.2. – badzil

-6

% thời gian - chạy tuyên bố chỉ một lần, và có sai số đo

% timeit - chạy tuyên bố vài lần, và choses nhất thời gian chính xác.

Xem Python timeit module documentation cho một số giải thích

+4

"RTFM" không phải là câu trả lời cho câu hỏi của tôi. Nếu tôi tạo danh sách 10 triệu tuples thay vì 1 triệu,% thời gian báo cáo 56 giây và% báo cáo thời gian 882 ms. Điều này không bình thường và tôi muốn biết tại sao. – badzil

+0

@badzil, bạn đã thử thực hiện% thời gian vài lần bằng tay chưa? Kết quả có giống nhau không? Và nếu bạn có cả 2.6 và 2.7 cố gắng tháo rời và tìm sự khác biệt giữa các mã được tạo ra (tôi chỉ có 2.7) – reclosedev

+0

Kết quả phù hợp nếu tôi chạy% time và% timeit nhiều lần. Bạn có thể xây dựng trên mã được tạo không? – badzil

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