Câu trả lời:
Theo mã nguồn , kích thước tối đa của một danh sách là PY_SSIZE_T_MAX/sizeof(PyObject*)
.
PY_SSIZE_T_MAX
được định nghĩa trong pyport.h là((size_t) -1)>>1
Trên hệ thống 32 bit thông thường, đây là (4294967295/2) / 4 hoặc 536870912.
Do đó, kích thước tối đa của danh sách python trên hệ thống 32 bit là 536.870.912 phần tử.
Miễn là số phần tử bạn có bằng hoặc thấp hơn mức này, tất cả các hàm danh sách sẽ hoạt động chính xác.
PyObject *
. Thứ đó được gọi là con trỏ (bạn nhận ra chúng vì có asterix ở 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 dài "chỉ" 4 byte vì với 4 byte bạn có thể giải quyết mọi phần tử trong bộ nhớ của máy tính ngày nay.
PY_SSIZE_T_MAX
có thể rất lớn.
Như tài liệu Python cho biết :
sys.maxsize
Số nguyên dương lớn nhất được hỗ trợ bởi loại Py_ssize_t của nền tảng và do đó danh sách kích thước tối đa, chuỗi, số và nhiều vùng 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
sys.maxsize
là câu trả lời cho câu hỏi. Các kiến trúc khác nhau hỗ trợ các cực đại khác nhau.
Chắc chắn là được. Trên thực tế, bạn có thể thấy cho 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 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 đã nói. Mảng càng lớn thì các hoạt động sẽ càng chậm.
Trong mã thông thường, tôi đã tạo danh sách với hàng triệu phần tử. Tôi tin rằng việc triển khai danh sách của Python chỉ bị ràng buộc bởi dung lượng bộ nhớ trên hệ thống của bạn.
Ngoài ra, các phương thức / chức năng của danh sách sẽ tiếp tục hoạt động bất chấp kích thước của danh sách.
Nếu bạn quan tâm đến hiệu suất, bạn có thể nên xem xét một thư viện chẳng hạn như NumPy .
Đặc điểm hiệu suất cho danh sách được mô tả trên Effbot.
Danh sách Python thực sự được triển khai dưới dạng vectơ để truy cập ngẫu nhiên nhanh, vì vậy về cơ bản vùng chứa sẽ chứa nhiều mục nhất là có không gian trong bộ nhớ. (Bạn cần không gian cho các 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.)
Việc O(1)
bổ sung là (độ phức tạp không đổi được phân bổ), tuy nhiên, việc chèn vào / xóa từ giữa dãy sẽ yêu cầu O(n)
sắp xếp lại (độ phức tạp tuyến tính), điều này 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 giới hạn. Nếu bạn thực hiện các phép so sánh thực sự chậm, thì sẽ mất nhiều thời gian, mặc dù đó không phải là lỗi của kiểu dữ liệu danh sách của Python .
Đả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 phải có O(n)
(độ phức tạp tuyến tính), vì bạn chạm vào mỗi con trỏ một lần).
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 càng lớn thì các thao tác trên nó càng lâu.
Tôi nhận được điều này từ đây trên hệ thống x64 bit: Python 3.7.0b5 (v3.7.0b5: abb8802389, ngày 31 tháng 5 năm 2018, 01:54:01) [MSC v.1913 64 bit (AMD64)] trên win32
Không có giới hạn về số lượng danh sách. Nguyên nhân chính gây ra lỗi của bạn là do RAM. Vui lòng nâng cấp kích thước bộ nhớ của bạn.
sizeof(PyObject*) == 4?
? Điều này đại diện cho điều gì?