Trong Python, mảng/danh sách có thể nhận được bao nhiêu? Tôi cần một mảng khoảng 12000 yếu tố. Tôi vẫn có thể chạy các phương thức mảng/danh sách như sắp xếp, v.v ...?Làm thế nào lớn một mảng Python có thể nhận được?
Trả lời
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 là ((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.
Tại sao 'sizeof (PyObject *) == 4?'? Điều này đại diện cho điều gì? – Matt
@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. –
Đ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. –
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.
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.
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
Thú vị, cảm ơn nhận xét. –
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.
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. –
@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 đó. –
@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ờ. –
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.
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).
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
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 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. –
- 1. Làm thế nào lớn một id có thể nhận được trong postgresql
- 2. Làm thế nào nhanh chóng có thể 'tìm kiếm tối đa trong một mảng' có thể nhận được?
- 3. Làm thế nào tôi có thể nhận được một mảng lười biếng trong Ruby?
- 4. Làm thế nào tôi có thể nhận được độ dài của một mảng trong awk?
- 5. Làm thế nào để lặp qua một tập dữ liệu lớn trong python mà không nhận được một MemoryError?
- 6. Python: lấy vị trí của vật phẩm lớn nhất trong một mảng có nhiều mảng
- 7. Làm thế nào để tạo một mảng bit trong Python?
- 8. android: làm thế nào tôi có thể nhận được kích thước của mảng chuỗi?
- 9. Làm thế nào để có được một mảng hình ảnh?
- 10. AS3 - Làm thế nào tôi có thể nhận được một mảng các hằng số của một lớp?
- 11. Làm thế nào tôi có thể tạo một vùng trăn số lượng lớn của datetime
- 12. Làm thế nào tôi có thể xoay một mảng 3D?
- 13. Làm thế nào tôi có thể nhận được của Python unittest để không bắt ngoại lệ?
- 14. Làm thế nào bạn có thể nhận được cây gọi với trình biên dịch python?
- 15. Python, làm thế nào tôi có thể nhận được khung hình gif
- 16. Python: làm thế nào tôi có thể nhận được một sợi để tự giết sau một thời gian chờ?
- 17. Làm thế nào tôi có thể nhận được một phần của trận đấu regex như một biến trong python?
- 18. Làm thế nào tôi có thể nhận được kích thước của một đối tượng trong HttpRuntime.Cache?
- 19. Làm thế nào tôi có thể nhận được các bit từ một chuỗi trong C#?
- 20. Làm thế nào để có được chỉ số phần tử lớn nhất trong mảng matlab
- 21. Mảng có thể quá lớn không?
- 22. Ở Django, làm thế nào tôi có thể nhận được thông báo của một ngoại lệ?
- 23. Làm thế nào tôi có thể nhận được một accumArray nghiêm ngặt?
- 24. Làm thế nào tôi có thể nhận được một ITextBuffer ra khỏi một EnvDTE.Window?
- 25. Làm thế nào tôi có thể nhận được một tham chiếu đến một Fragment trong ViewPager?
- 26. Làm thế nào tôi có thể nhận được một trình tạo Python để trả về None chứ không phải StopIteration?
- 27. Làm thế nào tôi có thể nhận được một biến truy cập trong Vim mà không cần python hoặc ruby?
- 28. Làm thế nào tôi có thể biết được một trường TEXT lớn trong Postgres như thế nào?
- 29. Làm thế nào để lưu mảng lớn để nó sẽ mất ít bộ nhớ trong python?
- 30. Làm thế nào để làm cho câu lệnh lớn hơn có thể đọc được
Có sự khác biệt lớn giữa các mảng và danh sách trong python. – recursive