Câu trả lời đơn giản: trong python hiện đại, mỗi loại dữ liệu là một lớp, do đó, chính thức không có sự khác biệt giữa hai giải pháp bạn đề xuất. (Hãy nhớ sử dụng các lớp kiểu mới: các lớp cổ điển đã lỗi thời! Xem http://docs.python.org/2/reference/datamodel.html#new-style-and- classic-classes )
Bây giờ câu hỏi nên là: làm thế nào để tôi tổ chức một cấu trúc dữ liệu hiệu quả trong python? Không có nghi ngờ rằng chính ý tưởng tổ chức các tế bào như là một mảng của các class Cell
trường hợp là quá kém hiệu quả. Bạn sẽ kết thúc với một mớ hỗn độn các con trỏ và dữ liệu không liên tục được sắp xếp như một danh sách liên kết phức tạp. Tất nhiên bạn có khả năng dễ dàng chèn các ô mới vào danh sách của mình: nhưng bạn có cần tính năng này không? Ngược lại, bạn sẽ có lưu trữ dữ liệu không liền kề và bạn phải truy cập vào mọi ô theo các mức độ khác nhau.
Nếu bạn sắp xếp dữ liệu của mình như một numpy.ndarray
dữ liệu thì liền kề bộ nhớ và việc truy cập các ô khác nhau chỉ đơn giản là thực hiện sải bước qua khối bộ nhớ của bạn: không gian hiệu quả (không lãng phí bộ nhớ cho con trỏ) và nhanh chóng .
Như Ethan đã chỉ ra, các khái niệm OO nên được sử dụng, nhưng ở cấp độ cao hơn, một khi cấu trúc dữ liệu mức thấp hiệu quả đã được triển khai, thường là thông qua numpy.ndarray
.
Lập trình OO có nghĩa là liên kết dữ liệu với các phương thức hoạt động trên chính dữ liệu ở mức độ trừu tượng cao hơn. (Một ví dụ: Tôi đã triển khai mã FEM trong đó ma trận độ cứng được định nghĩa là một lớp với phương pháp cho yếu tố cholesky siêu nốt thưa thớt. Việc triển khai đầu tiên là trong lõi: khi cần triển khai ngoài lõi, điều này là cần thiết đã thu được thông qua kế thừa và điều chỉnh tối thiểu cho việc lưu trữ dữ liệu gạch chân. Gần như 100% mã cholesky siêu nốt được sử dụng lại.)
Một nhận xét cuối cùng, nhưng rất quan trọng: một thủ tục số hiệu quả là kết quả của việc ánh xạ thông minh thuật toán và cấu trúc dữ liệu vào kiến trúc điện toán mục tiêu của bạn. Nếu bạn bắt đầu với cấu trúc dữ liệu sai, không có cách nào phục hồi hiệu quả, mà không viết lại hoàn toàn.