2009-12-01 38 views
11

Các phần của NumPy và/hoặc SciPy có được lập trình bằng C/C++ không?Bao nhiêu NumPy và SciPy là trong C?

Và mức phí gọi C từ Python so với chi phí gọi C từ Java và/hoặc C# như thế nào?

Tôi chỉ tự hỏi nếu Python là một lựa chọn tốt hơn so với Java hoặc C# cho các ứng dụng khoa học.

Nếu tôi nhìn vào shootouts, Python mất đi một khoản lợi nhuận rất lớn. Nhưng tôi đoán điều này là bởi vì họ không sử dụng thư viện của bên thứ ba trong các điểm chuẩn đó.

+5

Mã python loạt đá luân lưu (ví dụ: http://shootout.alioth.debian.org/u32/benchmark.php?test=regexdna&lang=python&id=1) không sử dụng numpy/scipy. – unutbu

+2

Đừng quên về Fortran. Python chơi độc đáo với Fortran quá –

+0

@ ~ unutbu Đó là loại khó hiểu mà bạn mong đợi chương trình regex-dna sử dụng numpy. – igouy

Trả lời

11
  1. Tôi sẽ đặt câu hỏi về bất kỳ điểm chuẩn nào không hiển thị nguồn cho từng triển khai (hoặc tôi đã bỏ lỡ điều gì đó)? Hoàn toàn có thể là một trong hai hoặc cả hai giải pháp đó được mã hóa một cách tồi tệ, điều này sẽ dẫn đến việc đánh giá không công bằng về hiệu suất của một trong hai hoặc cả hai ngôn ngữ.[Chỉnh sửa] Rất tiếc, giờ tôi thấy nguồn. Như những người khác đã chỉ ra mặc dù, nó không sử dụng các thư viện NumPy/SciPy vì vậy những điểm chuẩn sẽ không giúp bạn đưa ra quyết định.
  2. Tôi tin rằng phần lớn NumPy và SciPy được viết bằng C và được gói bằng Python để dễ sử dụng.
  3. Nó có thể phụ thuộc vào những gì bạn đang làm trong bất kỳ ngôn ngữ nào là bao nhiêu chi phí cho một ứng dụng cụ thể.

Tôi đã sử dụng Python để xử lý và phân tích dữ liệu trong một vài năm nay vì vậy tôi cho rằng nó chắc chắn phù hợp cho mục đích.

Bạn đang cố gắng đạt được gì vào cuối ngày? Nếu bạn muốn có một cách nhanh chóng để phát triển mã có thể đọc được, Python là một lựa chọn tuyệt vời và chắc chắn đủ nhanh cho lần đâm đầu tiên vào bất cứ thứ gì bạn đang cố giải quyết.

Tại sao không có dấu gạch chéo ở mỗi nhóm cho một tập con nhỏ của vấn đề và đánh giá kết quả về thời gian phát triển và thời gian chạy? Sau đó, bạn có thể đưa ra quyết định khách quan dựa trên một số dữ liệu có liên quan ... hoặc ít nhất đó là điều tôi muốn làm :-)

+0

Mã nguồn là có sẵn bằng cách điều hướng đến một chương trình cụ thể. Cuộn xuống dưới cùng và nhấp vào một trong các liên kết "Python CPython". Ví dụ: http://shootout.alioth.debian.org/u32/benchmark.php?test=mandelbrot&lang=python&id=5 –

+1

+1 ngay bây giờ. Sau khi tải về mã nguồn NumPy tôi có thể xác nhận nó chủ yếu là C bọc trong Python. –

+0

Bởi "cho bây giờ" Tôi có nghĩa là nó là một câu trả lời tuyệt vời tôi sẽ chấp nhận nó nếu không ai tạo ra một so sánh tốt các chi phí khác nhau cho C interop trong Python, Java và C#. Ngoài ra, tôi sẽ làm theo lời khuyên của bạn và thử nghiệm một phần của ứng dụng trong cả 3 ngôn ngữ. –

5

Rất nhiều văn bản được viết bằng C hoặc fortran. Bạn có thể viết lại các vòng nóng trong C (hoặc sử dụng một trong những cách để tăng tốc độ python lên, tăng/dệt là yêu thích của tôi), nhưng nó thực sự quan trọng?

Ứng dụng khoa học của bạn sẽ được chạy một lần. Phần còn lại chỉ là gỡ lỗi và phát triển, và những thứ đó có thể nhanh hơn rất nhiều trên Python.

+1

thực sự - bạn nên jus ttry nó: sử dụng Python Numeric từ một giao diện điều khiển tương tác Python để tạo ra một số ma trận, và làm cho một số operatins với họ "sống". - Nó cung cấp cho bạn một cách dễ sử dụng và linh hoạt vượt trội so với các công cụ khác - điều này làm tăng thêm bất kỳ sự phát triển nào vì các ý tưởng mới và các mẫu sử dụng có thể được thử ngay lập tức. Dấu nhắc tương tác SciPy thường được sử dụng như là một thay thế cho MatLab và các công cụ khoa học đắt tiền khác (và bằng cách nào đó hạn chế). – jsbueno

+2

"Ứng dụng khoa học của bạn sẽ được chạy một lần. Phần còn lại chỉ là gỡ lỗi và phát triển và những ứng dụng này có thể nhanh hơn nhiều trên Python". - Bình thường tôi đồng ý. Nhưng ứng dụng này có thể chạy trong nhiều ngày hoặc thậm chí vài tuần, do đó, cắt giảm chỉ một chút về thời gian xử lý sẽ tiết kiệm được rất nhiều thời gian thực. Nó sẽ được chạy nhiều lần. –

4

Có so sánh tốt hơn here (không phải điểm chuẩn nhưng cho biết cách tăng tốc Python). NumPy chủ yếu được viết bằng C. Lợi thế chính của Python là có một số cách để rất dễ dàng mở rộng mã của bạn với C (ctypes, swig, f2py)/C++ (boost.python, weave.inline, dệt. blitz)/Fortran (f2py) - hoặc thậm chí chỉ bằng cách thêm chú thích kiểu vào Python để nó có thể được xử lý thành C (cython). Tôi không nghĩ rằng có rất nhiều thứ dễ dàng cho C# hoặc Java - ít nhất là việc xử lý không cần thiết truyền các mảng số khác nhau (mặc dù tôi đoán những người ủng hộ sẽ tranh luận vì họ không có hình phạt về hiệu suất của Python, ít cần đến).

+1

Liên kết của bạn dường như bị hỏng. Có lẽ bạn có thể thay thế nó? –

4

Hầu hết NumPy đều ở trong C, nhưng phần lớn mã C là "bản mẫu" để xử lý tất cả các chi tiết bẩn của giao diện Python/C. Tôi nghĩ rằng tỷ lệ C so với Python là khoảng 50/50 ATM cho NumPy.

Tôi không quá quen thuộc với chi tiết cấp thấp dựa trên vm, nhưng tôi tin rằng chi phí giao diện sẽ cao hơn do các hạn chế được đặt trên jvm và .clr. Một trong những lý do tại sao numpy thường nhanh hơn so với các môi trường tương tự là biểu diễn bộ nhớ và cách mảng được chia sẻ/truyền giữa các hàm. Trong khi hầu hết các môi trường (Matlab và R cũng như tôi tin) sử dụng Copy-On-Write để truyền các mảng giữa các hàm, thì NumPy sử dụng các tham chiếu. Nhưng làm như vậy trong ví dụ JVM sẽ khó (vì hạn chế về cách sử dụng con trỏ, v.v ...). Đó là doable (một cổng đầu của NumPy cho Jython tồn tại), nhưng tôi không biết làm thế nào họ giải quyết vấn đề này. Có lẽ C++/Cli sẽ làm điều này dễ dàng hơn, nhưng tôi không có kinh nghiệm với môi trường đó.

+0

@DavidCournapeaud truyền một mảng từ C# đến một tệp dll gốc dễ dàng như việc truyền con trỏ. Trong thực tế, không có bản sao (như cho Java) của mảng được thực hiện. Mảng _is_ chuyển thành tham chiếu (được ghim) với rất ít chi phí. – user492238

0

Nó luôn phụ thuộc vào khả năng của riêng bạn để xử lý ngôn ngữ, do đó ngôn ngữ có thể tạo mã nhanh. Ngoài kinh nghiệm của tôi, numpy là chậm hơn nhiều lần sau đó tốt thực hiện. Và tôi hy vọng JAVA sẽ tương tự nhanh. Các trình biên dịch JIT tối ưu hóa của chúng đã được cải thiện đáng kể qua nhiều năm và tạo ra các hướng dẫn rất hiệu quả.

gọn gàng, mặt khác đi kèm với cú pháp dễ sử dụng hơn cho những ngôn ngữ được hòa hợp với ngôn ngữ kịch bản. Nhưng nếu nói đến phát triển ứng dụng, những lợi thế đó thường trở thành những trở ngại và bạn sẽ khao khát cho các IDE doanh nghiệp và an toàn. Ngoài ra, khoảng cách cú pháp đã được đóng bằng C#. Ngày càng có nhiều thư viện khoa học tồn tại cho Java.NET. Cá nhân tôi có xu hướng hướng tới C#, bacause nó cung cấp cú pháp tốt hơn cho mảng đa chiều và bằng cách nào đó cảm thấy 'hiện đại' hơn. Nhưng tất nhiên, đây chỉ là kinh nghiệm cá nhân của tôi.

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