Bộ nhớ của mảng được mô tả trong tài liệu và được thảo luận ở đây rất nhiều. Danh sách bố trí bộ nhớ cũng đã được thảo luận, mặc dù thường chỉ tương phản với numpy.
Mảng sần có bộ đệm dữ liệu kích thước cố định. 'phát triển' nó đòi hỏi phải tạo một mảng mới và sao chép dữ liệu vào nó. np.concatenate
thực hiện điều đó trong mã được biên dịch. np.append
cũng như tất cả các chức năng stack
sử dụng concatenate
.
Danh sách có, như tôi hiểu nó, một bộ đệm dữ liệu liền kề có chứa con trỏ đến các đối tượng khác trong đó trong memeory. Python duy trì một số khả năng tự do trong bộ đệm đó, vì vậy việc bổ sung với list.append
tương đối nhanh và dễ dàng. Nhưng khi các freespace lấp đầy, nó đã tạo ra một bộ đệm mới và sao chép con trỏ. Tôi có thể thấy nơi mà có thể tốn kém với các danh sách lớn.
Vì vậy, danh sách sẽ lưu trữ con trỏ cho mỗi phần tử, cộng với chính phần tử đó (ví dụ: dấu phẩy) ở một nơi khác trong bộ nhớ. Ngược lại, mảng nổi lưu trữ các bản thân float như các byte tiếp giáp trong bộ đệm của nó. (Đối tượng mảng dtype giống như danh sách).
Cách được khuyến nghị để tạo mảng lặp lại là tạo danh sách với append
và tạo mảng một lần ở cuối. Lặp đi lặp lại np.append
hoặc np.concatenate
là tương đối đắt tiền.
deque
đã được đề cập. Tôi không biết nhiều về cách lưu trữ dữ liệu của nó. Các tài liệu nói rằng nó có thể thêm các yếu tố vào đầu dễ dàng như ở phần cuối, nhưng truy cập ngẫu nhiên chậm hơn so với một danh sách. Điều đó ngụ ý rằng nó lưu trữ dữ liệu trong một số loại danh sách liên kết, để tìm kiếm các yếu tố nth
yêu cầu đi qua các liên kết n-1
trước khi nó. Vì vậy, có một sự cân bằng giữa tăng trưởng dễ dàng và tốc độ truy cập.
Thêm phần tử vào đầu danh sách yêu cầu tạo danh sách con trỏ mới, với (các) con trỏ mới khi bắt đầu. Vì vậy, thêm, và loại bỏ các yếu tố từ đầu của một danh sách thường xuyên, là đắt hơn nhiều so với làm điều đó ở cuối.
Phần mềm đề xuất nằm ngoài mục đích SO cốt lõi. Những người khác có thể đưa ra đề xuất, nhưng đừng ngạc nhiên nếu điều này bị đóng.
Có các định dạng tệp như HDF5
được thiết kế cho các tập dữ liệu lớn.Chúng phù hợp với sự tăng trưởng với các tính năng như 'chunking'. Và có tất cả các loại gói cơ sở dữ liệu.
bạn có nghĩa là mảng (https://docs.python.org/2/library/array.html) không? hoặc danh sách? bởi vì đó là hai thứ khác nhau trong python. Mảng làm chậm phát triển trong python. – MooingRawr
(Chỉ cần một số suy nghĩ): Tôi nghĩ rằng danh sách của CPython/arraylist-hành vi tương tự như std :: vector, nhưng không cung cấp cho bạn hướng dẫn kiểm soát có sẵn trong c + +. Tôi có thể tưởng tượng, rằng có thể có nhiều khả năng hơn về phía thuật toán trong các trường hợp sử dụng của bạn (đặc biệt là np.append không phải là một hoạt động rất phổ biến). Nếu không, bạn luôn có thể xây dựng một số std :: vector wrapper với [cython] (http://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html). Tôi cũng thích đề cập đến deque của blue_note khi tôi yêu quá trình 2 bước phát triển dữ liệu dựa trên danh sách được liên kết + biến đổi mảng ở cuối. – sascha
@MooingRawr Lý do tại sao tôi tham gia vào danh sách này là bởi vì nó không phải là liên tiếp trong bộ nhớ, và vẫn còn chậm với mảng lớn hơn. Vì vậy, tôi thành thật không hiểu những gì đang xảy ra. –