Tôi mới dùng python, đến từ MATLAB. Tôi có một ma trận thưa thớt lớn được lưu ở định dạng MATLAB v7.3 (HDF5). Tôi đã tìm thấy hai cách tải trong tệp bằng cách sử dụng h5py
và tables
. Tuy nhiên hoạt động trên ma trận có vẻ rất chậm sau đó. Ví dụ, trong matlab:Đang tải ma trận thưa thớt Matlab được lưu với -7.3 (HDF5) vào Python và thao tác trên nó
>> whos
Name Size Bytes Class Attributes
M 11337x133338 77124408 double sparse
>> tic, sum(M(:)); toc
Elapsed time is 0.086233 seconds.
Sử dụng bảng:
t = time.time()
sum(f.root.M.data)
elapsed = time.time() - t
print elapsed
35.929461956
Sử dụng h5py:
t = time.time()
sum(f["M"]["data"])
elapsed = time.time() - t
print elapsed
(Tôi đã bỏ chờ đợi ...)
[EDIT]
Dựa trên nhận xét từ @bpgergo, tôi nên thêm rằng tôi đã cố gắng chuyển đổi kết quả nạp bằng h5py
(f
) vào một mảng numpy
hoặc một mảng thưa thớt scipy
trong hai cách sau:
from scipy import sparse
A = sparse.csc_matrix((f["M"]["data"], f["M"]["ir"], f["tfidf"]["jc"]))
hoặc
data = numpy.asarray(f["M"]["data"])
ir = numpy.asarray(f["M"]["ir"])
jc = numpy.asarray(f["M"]["jc"])
A = sparse.coo_matrix(data, (ir, jc))
nhưng cả hai hoạt động này đều rất chậm.
Có điều gì tôi thiếu ở đây không?
Tải tệp ở gần như tức thời trong Matlab (<1 giây) vì vậy tôi nghĩ việc so sánh là công bằng, nhưng tôi lấy điểm của bạn về hàm tổng tích hợp sẵn. Tôi nghĩ ngày càng nhiều người sẽ làm những gì tôi đang làm (chuyển từ Matlab sang Python) nên sẽ tốt hơn nếu có thêm một chút hỗ trợ để tải các tập tin Matlab IMHO ... – tdc
Vâng, tôi không thể kiểm tra nó mà không cần tệp của bạn, nhưng thực sự tải mảng trong python cũng rất nhanh. Những gì bạn hiện đang làm không thực sự tải nó. Nó reutrns những gì có hiệu quả một mảng ánh xạ bộ nhớ. Truy cập nó một cách độc lập sẽ rất chậm trong bất kỳ ngôn ngữ nào, vì nó chủ yếu là tìm kiếm đĩa. Mã ví dụ trên vẫn còn chậm? Ngoài ra, hãy xem 'scipy.io.loadmat' http://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html#scipy.io.loadmat, mặc dù tôi không xem chắc chắn nếu nó hỗ trợ mảng thưa thớt. –
chưa có cơ hội để thử nhưng nhờ đầu vào – tdc