2010-03-08 64 views
11

Có phải len(list) tính toán độ dài của danh sách mỗi khi nó được gọi, hay nó trả về giá trị của bộ đếm tích hợp?
Tôi có một bối cảnh mà tôi cần phải kiểm tra độ dài của một danh sách mỗi khi qua một vòng lặp, như:Trong python, len (danh sách) làm gì?

listData = [] 
for value in ioread(): 
    if len(listData)>=25: 
     processlistdata() 
     clearlistdata() 
    listData.append(value) 

Tôi có nên kiểm tra len(listData) trên mỗi lần lặp, hay tôi nên có một bộ đếm cho độ dài của danh sách ?

+4

Tôi 99,9% tích cực rằng bất kỳ loại trình tự nào trong các ngôn ngữ cấp cao sẽ lưu trữ độ dài của nó. Các hàm 'len' (hoặc' strlen' hoặc 'length') trong Python, Perl, và Ruby (và các ngôn ngữ khác) không bao giờ nên dùng thời gian O (N). –

+0

Tôi sẽ thay thế mã của bạn bằng 'cho chunk trong cá mú (ioread(), 25): process (chunk)' Where 'grouper()' được định nghĩa tương tự như http://docs.python.org/library/itertools. html # recipes (bạn có thể thay thế 'izip_longest()' bằng 'izip()' để giảm các giá trị cuối cùng khi mã của bạn làm). – jfs

+0

Bạn có đo hai phiên bản để xem phiên bản nào thực sự nhanh hơn không? Việc sử dụng 'timeit' và đăng kết quả của bạn dễ dàng hơn để chúng tôi có thể nhận xét về chúng. –

Trả lời

16

Bạn có lẽ nên biết, nếu bạn lo lắng về hiệu suất của hoạt động này, "liệt kê" trong Python are really mảng động. Tức là, chúng không được triển khai dưới dạng danh sách liên kết, mà bạn thường phải "đi bộ" để tính toán độ dài (trừ khi được lưu trữ trong tiêu đề).

Vì họ đã cần lưu trữ thông tin "kế toán" để xử lý phân bổ bộ nhớ, độ dài cũng được lưu trữ.

1
Help on built-in function len in module __builtin__: 

len(...) 
    len(object) -> integer 

    Return the number of items of a sequence or mapping. 

vì vậy có, len(list) trả về số lượng mục trong danh sách. Bạn có thể muốn mô tả chi tiết hơn, cung cấp các tệp/đầu ra cần thiết để giúp hiểu rõ hơn về những gì bạn muốn làm.

+8

OP lo lắng về việc liệu độ dài này sẽ được tính toán lại mỗi khi được yêu cầu. –

+0

tôi nghĩ rằng nó cũng phụ thuộc vào những gì ioread() không. – ghostdog74

0

len(list) trả về độ dài của danh sách. Nếu bạn thay đổi nó, bạn sẽ phải kiểm tra chiều dài của nó mỗi lần lặp lại. Hoặc sử dụng bộ đếm.

0

len (danh sách) trả về độ dài của danh sách. Mỗi khi bạn gọi nó, nó sẽ trả về độ dài của danh sách như hiện tại. Bạn có thể thiết lập một truy cập bằng cách lấy len của danh sách ban đầu và sau đó thêm 1 vào biến mỗi khi một cái gì đó được nối vào danh sách.

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