2010-09-01 49 views
10

Tôi muốn tính toán thời gian avarage timedelta giữa các ngày trong một danh sách. Mặc dù sau đây hoạt động tốt, tôi tự hỏi nếu có một cách thông minh hơn?Timedelta trung bình trong danh sách

delta = lambda last, next: (next - last).seconds + (next - last).days * 86400 
total = sum(delta(items[i-1], items[i]) for i in range(1, len(items))) 
average = total/(len(items) - 1) 
+1

thêm một số 0 vào cuối 8640 sẽ là khởi đầu tốt;) – aaronasterling

+0

Tại sao không tăng tốc độ quay của trái đất? ... Đoán bạn đúng =) – shinn

Trả lời

33

Btw, nếu bạn có danh sách thời gian biểu hoặc thời gian biểu, tại sao bạn thậm chí tự làm bất kỳ phép toán nào?

+3

+1 Bởi vì cả OP lẫn tôi đều không biết đó là một khả năng. datetime crap thậm chí còn nhàm chán hơn so với dây;) – aaronasterling

+0

Tôi sẽ đi theo cách của bạn để tính trung bình và aaronasterling để có được các đồng bằng. Thanks =) – shinn

+0

Nó không phải là rất Pythonic để lặp qua các chỉ số. Tôi sẽ đi với: '[a - b cho a, b trong zip (datetimes [: - 1], datetimes [1:])]' – abukaj

3

Hãy thử điều này:

from itertools import izip 

def average(items): 
    total = sum((next - last).seconds + (next - last).days * 86400 
       for next, last in izip(items[1:], items)) 
    return total/(len(items) - 1) 

Theo tôi làm việc đó như thế này là dễ đọc hơn. Nhận xét cho người đọc ít nghiêng về mặt toán học của mã của bạn có thể giúp giải thích cách bạn tính toán từng delta. Đối với những gì nó có giá trị, một biểu hiện máy phát điện có ít nhất (và tôi nghĩ rằng ít chậm) hướng dẫn opcode của bất cứ điều gì tôi nhìn vào.

# The way in your question compiles to.... 
    3   0 LOAD_CONST    1 (<code object <lambda> at 0xb7760ec0, file 

"scratch.py", line 3>) 
       3 MAKE_FUNCTION   0 
       6 STORE_DEREF    1 (delta) 

    4   9 LOAD_GLOBAL    0 (sum) 
      12 LOAD_CLOSURE    0 (items) 
      15 LOAD_CLOSURE    1 (delta) 
      18 BUILD_TUPLE    2 
      21 LOAD_CONST    2 (<code object <genexpr> at 0xb77c0a40, file "scratch.py", line 4>) 
      24 MAKE_CLOSURE    0 
      27 LOAD_GLOBAL    1 (range) 
      30 LOAD_CONST    3 (1) 
      33 LOAD_GLOBAL    2 (len) 
      36 LOAD_DEREF    0 (items) 
      39 CALL_FUNCTION   1 
      42 CALL_FUNCTION   2 
      45 GET_ITER    
      46 CALL_FUNCTION   1 
      49 CALL_FUNCTION   1 
      52 STORE_FAST    1 (total) 

    5   55 LOAD_FAST    1 (total) 
      58 LOAD_GLOBAL    2 (len) 
      61 LOAD_DEREF    0 (items) 
      64 CALL_FUNCTION   1 
      67 LOAD_CONST    3 (1) 
      70 BINARY_SUBTRACT  
      71 BINARY_DIVIDE  
      72 STORE_FAST    2 (average) 
      75 LOAD_CONST    0 (None) 
      78 RETURN_VALUE   
None 
# 
#doing it with just one generator expression and itertools... 

    4   0 LOAD_GLOBAL    0 (sum) 
       3 LOAD_CONST    1 (<code object <genexpr> at 0xb777eec0, file "scratch.py", line 4>) 
       6 MAKE_FUNCTION   0 

    5   9 LOAD_GLOBAL    1 (izip) 
      12 LOAD_FAST    0 (items) 
      15 LOAD_CONST    2 (1) 
      18 SLICE+1    
      19 LOAD_FAST    0 (items) 
      22 CALL_FUNCTION   2 
      25 GET_ITER    
      26 CALL_FUNCTION   1 
      29 CALL_FUNCTION   1 
      32 STORE_FAST    1 (total) 

    6   35 LOAD_FAST    1 (total) 
      38 LOAD_GLOBAL    2 (len) 
      41 LOAD_FAST    0 (items) 
      44 CALL_FUNCTION   1 
      47 LOAD_CONST    2 (1) 
      50 BINARY_SUBTRACT  
      51 BINARY_DIVIDE  
      52 RETURN_VALUE   
None 

Cụ thể, thả lambda cho phép chúng tôi tránh đóng cửa, xây dựng một bộ và tải hai đóng. Năm hàm được gọi là một trong hai cách. Tất nhiên mối quan tâm này với hiệu suất là vô lý nhưng nó là tốt đẹp để biết những gì đang xảy ra dưới mui xe. Điều quan trọng nhất là dễ đọc và tôi nghĩ rằng làm theo cách này cũng đạt điểm cao.

+0

Vâng, tốt hơn nhiều. Cảm ơn! – shinn

+0

@shinn, nếu bạn chấp nhận câu trả lời của THC4k, thì tôi có thể xóa câu trả lời này. – aaronasterling

+0

Bạn không nên xóa nó. Tôi thích cách với izip. – shinn

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