Tôi hỏi câu hỏi này cùng nằm trong danh sách MongoDB-user: http://groups.google.com/group/mongodb-user/browse_thread/thread/b3470d6a867cd24MongoDB python ràng buộc một thứ tự độ lớn chậm hơn java?
Tôi đã hy vọng một ai đó trên diễn đàn này có thể có một số cái nhìn sâu sắc ...
tôi đã chạy một thí nghiệm đơn giản so sánh hiệu suất của con trỏ lặp sử dụng python so với java và đã thấy rằng việc triển khai python chậm hơn khoảng 10 lần. Tôi đã hy vọng một ai đó có thể cho tôi biết nếu sự khác biệt này được mong đợi hoặc nếu tôi đang làm một cái gì đó rõ ràng không hiệu quả ở phía bên python.
Điểm chuẩn rất đơn giản: nó thực hiện truy vấn, lặp qua con trỏ và kiểm tra cùng một trường trong mỗi tài liệu. Trong phiên bản python, tôi có thể kiểm tra khoảng 22k tài liệu mỗi giây. Trong phiên bản java, tôi có thể kiểm tra khoảng 220k tài liệu mỗi giây.
Tôi đã nhìn thấy một vài câu hỏi tương tự về hiệu suất python và tôi đã đưa ra những lời khuyên và chắc chắn tôi đang sử dụng các phần mở rộng C:
>>> import pymongo
>>> pymongo.has_c()
True
>>> import bson
>>> bson.has_c()
True
Cuối cùng, tôi không tin rằng sự chênh lệch do sự khác biệt cơ bản giữa python và java, ít nhất là ở cấp độ mã thử nghiệm của tôi. Ví dụ, nếu tôi lưu trữ các tài liệu truy vấn trong một danh sách python, tôi có thể lặp qua danh sách đó rất nhanh chóng. Nói cách khác, nó không phải là một python không hiệu quả cho vòng lặp mà tài khoản cho sự khác biệt. Hơn nữa, tôi nhận được hiệu suất gần như giống hệt Java so với Python khi chèn tài liệu.
Dưới đây là một vài thông tin về truy vấn:
- Cả python và java triển khai sử dụng cùng một truy vấn về bộ sưu tập giống nhau và chạy trên cùng một máy.
- Bộ sưu tập chứa khoảng 20 triệu tài liệu.
- Truy vấn trả về khoảng 2 triệu tài liệu, tức là tôi đang lấy khoảng 10% bộ sưu tập.
- Mỗi tài liệu chứa ba trường đơn giản: ngày và hai chuỗi.
- Truy vấn được lập chỉ mục và thời gian sử dụng trong truy vấn thực tế là không đáng kể cho cả triển khai python và java.Đó là lần lặp con trỏ tính toán thời gian chạy.
Trình điều khiển Java có thể đọc toàn bộ kết quả vào bộ nhớ và trình điều khiển trăn sẽ truyền kết quả. Bạn có thể thử đặt batch_size trong cả hai trình điều khiển. –
Bạn có thể đăng mã đầy đủ lên cả hai phiên bản mã Python và Java không? Chúng tôi có thể xem liệu người khác có thể sao chép kết quả của bạn hay không. –
Chỉ cần lưu ý, nếu bạn theo liên kết đến chuỗi Google Groups, mã được đăng (cả hai ngôn ngữ) cũng như được xem xét bởi 10 người và những bài kiểm tra khác được thực hiện. TL; DR 10gen thử nghiệm cho thấy một ít hơn 2x chậm hơn với python hơn java và một số khác biệt trong thử nghiệm có thể đến từ phiên bản của python sử dụng –