2012-03-30 22 views
25

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.
+7

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. –

+4

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. –

+1

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 –

Trả lời

2

Vâng nhìn vào bài viết của bạn trên Google Groups là tốt, đây là 2c của tôi:

  1. Python là chậm hơn so với Java. Vì Python không được đánh máy, nên trình thông dịch không thể thực hiện tất cả các phép thuật Java JIT "" và vì vậy nó sẽ luôn luôn chậm hơn trong thời gian chạy.

  2. Trên Google Groups thread nó được tuyên bố rằng:

"Điều ngạc nhiên lớn trong kết quả là cách hiệu suất Python chuẩn thoái hóa khi tôi chèn ngắn giá trị Nếu bất cứ điều gì,. Tôi có thể đã mong đợi điều ngược lại. Ngược lại, các số Java là về cơ bản giống nhau đối với các chuỗi dài và ngắn ".

Điều này có thể gây hiểu lầm do hành vi không đồng bộ của Mongo khi nói đến viết.Hãy chắc chắn rằng bạn đặt cùng một mối quan tâm Viết khi bạn kích hoạt các ghi đó trong cả hai chuẩn Java và Python của bạn (và tốt nhất là đặt nó thành SAFE_MODE). Nói cách khác, nếu bạn không cụ thể đặt bất kỳ mối quan tâm viết nào, hãy đảm bảo giá trị mặc định của trình điều khiển giống nhau ở cả hai biến thể Python và Java.

Các vấn đề liên quan