2009-05-12 20 views

Trả lời

149

Theo số source code, kích thước tối đa của danh sách là PY_SSIZE_T_MAX/sizeof(PyObject*).

PY_SSIZE_T_MAX được định nghĩa trong pyport.h((size_t) -1)>>1

Trên một hệ thống 32bit thường xuyên, đây là (4294967295/2)/4 hoặc 536870912.

Do đó kích thước tối đa của một danh sách python trên một chút 32 hệ thống là 536,870,912 yếu tố.

Miễn là số phần tử bạn có bằng hoặc thấp hơn, tất cả các chức năng danh sách sẽ hoạt động chính xác.

+2

Tại sao 'sizeof (PyObject *) == 4?'? Điều này đại diện cho điều gì? – Matt

+3

@Matt, là số byte của một 'PyObject *' duy nhất. Điều đó là một con trỏ được gọi là (bạn nhận ra chúng vì dấu hoa thị ở cuối). Con trỏ dài 4 byte và lưu trữ một địa chỉ bộ nhớ cho đối tượng được cấp phát. Chúng là "chỉ" 4 byte dài vì với 4 byte bạn có thể giải quyết mọi phần tử trong bộ nhớ của các máy tính ngày nay. –

+0

Điều đáng chú ý (như câu trả lời của Álvaro Justen cho biết) rằng trên các máy khác, đặc biệt là những máy chạy hệ thống 64 bit, giá trị của 'PY_SSIZE_T_MAX' có thể rất lớn. –

4

12000 phần tử không có gì trong Python ... và thực sự số lượng phần tử có thể đi xa như trình thông dịch Python có bộ nhớ trên hệ thống của bạn.

1

Tôi muốn nói rằng bạn chỉ bị giới hạn bởi tổng dung lượng RAM có sẵn. Rõ ràng là mảng lớn hơn các hoạt động dài hơn sẽ mất.

+3

Nói chung là đúng, nhưng không phải tất cả chúng - phụ thêm vẫn còn thời gian không đổi được khấu hao độc lập với kích thước của mảng. – cdleary

+0

Thú vị, cảm ơn nhận xét. –

24

Chắc chắn là không sao. Trên thực tế bạn có thể xem cho chính mình một cách dễ dàng:

l = range(12000) 
l = sorted(l, reverse=True) 

Chạy những dòng trên máy tính của tôi mất:

real 0m0.036s 
user 0m0.024s 
sys 0m0.004s 

Nhưng chắc chắn như mọi người khác nói. Mảng càng lớn thì hoạt động càng chậm.

+15

Thời gian theo cách này có thể gây hiểu lầm - phần lớn thời gian được sử dụng để khởi động trình thông dịch Python. Một cách tốt hơn là: python -m timeit.py "l = range (12000); l = được sắp xếp (l, reverse = True)". Trên máy của tôi, điều này cho khoảng 1/20 thời gian cho ví dụ này. –

+3

@dF, Bạn đúng về độ chính xác. Cảm ơn vì đã chú ý điều đó. Tôi chỉ muốn chứng minh một điểm. Và ví dụ chứng minh điều đó. –

+8

@dF: Tuyệt vời! 0,024s là quá dài đối với tôi và tôi vui vì tôi có thể ngừng lo lắng về điều đó ngay bây giờ. –

6

Trong mã thông thường, tôi đã tạo danh sách với hàng triệu thành phần. Tôi tin rằng việc triển khai danh sách của Python chỉ bị ràng buộc bởi lượng bộ nhớ trên hệ thống của bạn.

Ngoài ra, các phương pháp/chức năng danh sách sẽ tiếp tục hoạt động mặc dù kích thước của danh sách.

Nếu bạn quan tâm đến hiệu suất, bạn nên xem thư viện như NumPy.

5

Performance characteristics for lists được mô tả trên Effbot.

Danh sách Python thực sự được triển khai dưới dạng véc tơ để truy cập ngẫu nhiên nhanh, do đó, vùng chứa về cơ bản sẽ lưu giữ nhiều mục vì có không gian cho bộ nhớ. (Bạn cần không gian cho con trỏ có trong danh sách cũng như không gian trong bộ nhớ cho (các) đối tượng được trỏ tới.)

Gắn thêm là O(1) (độ phức tạp liên tục được phân bổ), tuy nhiên, chèn vào/xóa từ giữa trình tự sẽ yêu cầu sắp xếp lại O(n) (độ phức tạp tuyến tính), thứ tự sẽ chậm hơn khi số lượng phần tử trong danh sách của bạn.

Câu hỏi sắp xếp của bạn có nhiều sắc thái hơn, vì thao tác so sánh có thể mất một khoảng thời gian không bị chặn. Nếu bạn đang thực hiện so sánh chậm, sẽ mất nhiều thời gian, mặc dù nó không có lỗi của Python's list data type.

Đảo ngược chỉ mất khoảng thời gian cần thiết để hoán đổi tất cả các con trỏ trong danh sách (nhất thiết là O(n) (độ phức tạp tuyến tính), vì bạn chạm vào từng con trỏ một lần).

31

Khi Python documentation says:

sys.maxsize

Các số nguyên dương lớn nhất được hỗ trợ theo loại Py_ssize_t của nền tảng, và do đó danh sách kích thước tối đa, dây, dicts, và nhiều đồ chứa khác có thể có.

Trong máy tính của tôi (Linux x86_64):

>>> import sys 
>>> print sys.maxsize 
9223372036854775807 
+0

cách này trả lời câu hỏi – ldgorman

+3

@ ldgorman, 'sys.maxsize' là câu trả lời cho câu hỏi. Kiến trúc khác nhau hỗ trợ tối đa khác nhau. –

+0

Giá trị trả về bởi sys.maxsize có phản ánh số lượng RAM có sẵn trong máy tính theo bất kỳ cách nào không? – GeoJohn

-8

Không có giới hạn số lượng danh sách. Lý do chính gây ra lỗi của bạn là RAM. Vui lòng nâng cấp kích thước bộ nhớ của bạn.

+1

-1 bởi vì nó không thực sự trả lời câu hỏi và thực sự gây hiểu nhầm bởi vì (được hiển thị bởi các câu trả lời khác) thực sự có Kích thước tối đa. –

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