Sử dụng các ngôn ngữ lập trình độc đáo để tính toán khoa học [đóng]


22

Lưu ý: bài đăng sau đây có thể bao gồm các ý kiến ​​gây tranh cãi, vì vậy xin lưu ý rằng chúng chỉ là ý kiến ​​của tôi và không có ý định xúc phạm bất cứ ai.

Tôi đang lập trình dưới hình thức này hay hình thức khác từ khoảng năm 1999. Ban đầu tôi sử dụng R, và sau đó, khoảng năm 2004, chủ yếu chuyển sang Python.

Đối với nhiều ứng dụng khoa học, ví dụ, mô phỏng, bao gồm cả những thứ như MCMC, cả R và Python đều quá chậm và cần phải được tăng tốc. Cách thông thường để làm như vậy là mở rộng với C hoặc C ++. Đối với cả R và Python, đây là những gì tôi đã làm, sử dụng API C của R với C ++ và thư viện Boost Python với Python.

Tuy nhiên, vì nhiều lý do, sự kết hợp này không phải là giải pháp lý tưởng. Điều gì là quan trọng trong lập trình, đặc biệt là các thuật toán? Biểu cảm và tốc độ, tất nhiên có liên quan. Một ngôn ngữ càng biểu cảm, người ta có thể viết nhanh hơn trong đó.

1) Theo như biểu cảm, cả R và Python đều không thực sự lý tưởng để viết các thuật toán khoa học theo ý kiến ​​của tôi. Họ không ánh xạ chặt chẽ với các thuật toán cơ bản. Tuy nhiên, cả hai đều tốt hơn đáng kể so với C ++.

2) Tôi thích viết bằng Python, một ngôn ngữ dễ chịu, mặc dù như đã lưu ý ở trên, nó không lý tưởng cho công việc thuật toán. Tuy nhiên, khi người ta phải làm việc với tổ hợp Python / C ++ vì vấn đề tốc độ, bản phối này trở nên kém dễ chịu hơn khi làm việc. Điều thường xảy ra là lần đầu tiên tôi viết bằng Python và một khi tôi có thứ gì đó hoạt động tốt, thường phát hiện ra rằng nó quá chậm (đối với một số giá trị chủ quan của quá chậm). Sau đó, tôi phải đối mặt với quyết định có nên dành một lượng thời gian không hợp lý để viết lại nó trong C ++ hay đưa ra sự chậm chạp. Nhìn nhận lại, tôi thường cảm thấy mình có thể tốt hơn khi vượt qua sự chậm chạp, đặc biệt là khi tốc độ thu được là không thể đoán trước. Ngoài ra, giao diện Boost Python giữa hai người là một vấn đề đau đầu về bảo trì đáng kể, và có mã bằng hai ngôn ngữ rất khác nhau được dán vào nhau như thế này chỉ gây mất tập trung. Không có chỉ trích về Boost Python có ý định, nó là một giao diện mạnh mẽ như người ta có thể tưởng tượng, và hầu như chỉ hoạt động hầu hết thời gian.

Bây giờ, trong một thế giới lý tưởng, với thời gian và nguồn lực không giới hạn, cả hai vấn đề này sẽ không phải là vấn đề lớn. Tuy nhiên, trong các dự án khoa học tôi đã thực hiện, tôi đã có kinh nghiệm sau đây.

Cho dù tôi có cộng tác viên trong dự án hay không, tôi dường như luôn kết thúc việc thực hiện phần lớn máy tính. Trong tổng số 5 dự án quan trọng, tôi chỉ có sự tham gia đáng kể của một người trong một dự án. Đó là một người đã làm nhiều hơn là kéo trọng lượng của mình; anh ấy đã làm nhiều như tôi hoặc nhiều hơn nữa. Tuy nhiên, trong tất cả các trường hợp khác, bao gồm các dự án có nhiều cộng tác viên, tôi đã thực hiện (hầu như) tất cả các công việc tính toán. Mặc dù tôi có thể nói rằng tôi chưa được ban phước với những cộng tác viên giỏi nhất (dường như đó là sự pha trộn giữa sự lười biếng và bất tài) nhưng tôi không rõ liệu tình trạng này có thể thay đổi trong tương lai hay không.

Công việc khoa học tính toán là một nỗ lực to lớn và nếu tôi không thể thay đổi cách cộng tác viên của mình cư xử, tôi có thể thay đổi cách làm việc. Cải tiến quan trọng nhất sẽ là hoàn thành công việc nhanh hơn. Điều này đưa tôi đến sự cân nhắc chính ở đây, đó là việc chuyển đổi ngôn ngữ sang một thứ gì đó ít chính thống hơn có thể giúp ích. Dựa trên nghiên cứu trước đây, các ứng cử viên có khả năng theo thứ tự khả năng nhất là Lisp và Ocaml chung. Tôi đã suy nghĩ về điều này trong nhiều năm, nhưng gần đây đã suy nghĩ về nó nghiêm túc hơn.

Theo tôi có thể nói, rất ít người sử dụng CL hoặc Ocaml cho tính toán khoa học. Khi tìm kiếm trang web này, tôi tìm thấy hai tài liệu tham khảo về CL (một là của tôi) và một cho Ocaml (của tôi). Tôi đã có một vài liên hệ đáng khích lệ trong những năm qua với những người thích phiêu lưu làm việc ở rìa. Vào năm 2008, tôi đã xem qua một cuốn sách đánh giá về "Lisp thực tế chung" của Peter Seibel (mà tôi sở hữu), bởi Tamas K. Papp. Điều này thu hút sự chú ý của tôi, vì đó là một trong số ít đề cập đến tính toán khoa học cho Lisp mà tôi đã bắt gặp trên mạng. Tôi đã viết thư cho Tamas, người ngay lập tức trả lời một cách hữu ích và khích lệ. Để báo cho anh ấy

Năng suất lập trình của tôi có thể tăng gấp 10 lần với Lisp, nhưng điều đó mất khoảng một năm để xảy ra và tôi vẫn đang học (mặc dù tôi đã làm khá tốt sau 2 tháng). Vì vậy, nếu bạn đang làm việc trên một cái gì đó quan trọng về thời gian, thì hãy hoãn việc chuyển đổi.

Bạn nên xem xét việc hỏi mọi người về cll, tôi không phải là người duy nhất biết về những điều này, những người khác làm máy tính khoa học trên Lisp.

Ông cũng có một blogmột trang GitHub .

Một người khác mà tôi đã trao đổi ngắn gọn với (vào tháng 12 năm 2006) là Ira Kalet , người đã sử dụng Common Lisp trong bối cảnh ung thư bức xạ.

Có lẽ có những người khác làm máy tính khoa học trên Lisp, nhưng tôi không biết ai cả.

Vấn đề phổ biến nhất mà mọi người trích dẫn với CL là thiếu thư viện. Đây là một vấn đề nghiêm trọng trong điện toán cho mục đích chung, nhưng có thể không quá nhiều trong điện toán khoa học, đặc biệt là từ việc triển khai các thuật toán. Cụ thể, tôi có thể nhận được hầu hết thời gian với một thư viện toán học cơ bản, bao gồm các hàm phân phối xác suất, thư viện mảng đa chiều và một bộ container cơ bản, ví dụ như map, set, list, v.v. như được tìm thấy trong các thư viện chuẩn C ++ và Python.

Tôi thậm chí còn biết ít về Ocaml hơn tôi về CL, nhưng đã ném nó vào như một cách thay thế. Nó được cho là rất nhanh, có một triển khai miễn phí bởi các nhà nghiên cứu Pháp, và có vẻ như là ngôn ngữ khả thi nhất trong họ ngôn ngữ ML cho máy tính khoa học.

Để kết luận, tôi tự hỏi nếu những người khác có kinh nghiệm với điều này, và họ có suy nghĩ gì, nếu có.

EDIT: Tôi chủ yếu quan tâm đến trải nghiệm đầu tay, trong bối cảnh các vấn đề tôi đã thảo luận ở trên. Ví dụ: nếu bạn đã từng sử dụng Python và C ++ (hoặc R và C ++) và chuyển sang một ngôn ngữ khó hiểu hơn, tôi rất muốn nghe về trải nghiệm của bạn.


2
Trao đổi ngăn xếp là để đặt câu hỏi, không phải để đăng câu chuyện cuộc sống! Câu hỏi của bạn dường như là "Có dự án điện toán khoa học nào sử dụng Common Lisp hoặc OCaml" không?
khinsen

4
Đồng ý, điều này đọc một chút giống như một bài viết trên blog, nhưng tôi thích tiền đề. Bất kỳ cơ hội nào bạn có thể thử và giảm điều này xuống còn 2-3 đoạn?
Aron Ahmadia

1
Cũng đồng ý. Bình luận và kinh nghiệm cá nhân là tốt khi nó hỗ trợ câu hỏi chính; quá nhiều chi tiết có thể tràn ra những điểm chính. Nếu bạn có thể cô đọng câu hỏi của mình, tôi nghĩ rằng nó sẽ dễ đọc hơn và nó sẽ nhận được nhiều câu trả lời hơn, chất lượng cao hơn.
Geoff Oxberry

1
@FaheemMitha: Trong "thế giới lý tưởng" mà bạn đề cập giữa chừng, nó sẽ được lắp ráp tối ưu bằng tay ... Nghe có vẻ ảm đạm với tôi!
meawoppl

3
@FaheemMitha: Điều tốt nhất tôi nghĩ bạn có thể làm để cải thiện câu hỏi của mình là làm cho câu hỏi bạn hỏi rõ ràng. Có vẻ như bạn đang kể một câu chuyện về những trải nghiệm của mình (điều đó hoàn toàn đúng), và cuối cùng, bạn chôn vùi câu hỏi như một câu nói ở cuối câu chuyện của bạn. ("Để kết luận, tôi đang tự hỏi ...") Điều tốt nhất bạn có thể làm là biến phần đó thành một câu hỏi, để mọi người lướt qua câu hỏi của bạn có thể dễ dàng xác định những gì bạn đang hỏi. Tôi đã phải quay lại một vài lần để tìm ra nó.
Geoff Oxberry

Câu trả lời:


18

Chúng tôi đã phát triển Juliachính xác những lý do nêu ra. Không có ngôn ngữ điện toán khoa học cấp cao tốt nào cũng cho hiệu năng đủ tốt, mà bạn không phải viết lại các phần trong mã của mình trong C / Fortran. Thiết kế của julia có một chút ảnh hưởng không nhỏ, vì vậy bạn có thể tìm thấy nó theo ý thích của mình, trong khi các cộng tác viên của bạn chỉ có thể coi nó như một tấm thảm hoặc R nếu họ không quan tâm đến các bộ phận chức năng. Nhược điểm là ngôn ngữ là mới, và chưa có tất cả các thư viện mà người ta sẽ cần để sử dụng hàng ngày.

Mark, rất thích thêm julia vào điểm chuẩn của bạn để xem giá vé của chúng tôi như thế nào. Đừng nhảy vào danh sách gửi thư của chúng tôi và cho chúng tôi biết những gì bạn muốn thấy trong julia để nó hữu ích hơn cho bạn.


Trông thật đẹp! Tôi chắc chắn sẽ kiểm tra điều này cho công việc của riêng tôi. Hiện tại tôi sử dụng python cho tất cả công việc của mình trong vấn đề cô đọng về mặt lý thuyết, chỉ vì thời gian đạt được bằng mã C ++ nhanh bị phủ nhận bởi thời gian viết bằng C ++ ở vị trí đầu tiên :)
Lagerbaer

9

Tốc độ, kích thước và độ tin cậy của các ngôn ngữ lập trình thực sự rất tốt trong việc gói ghém rất nhiều mối quan tâm khác nhau được thể hiện trong "câu hỏi" của bạn. Nó so sánh tốc độ và kích thước cơ sở của một loạt các triển khai có cùng điểm chuẩn trên 33 ngôn ngữ!

Tôi đã trở thành một người yêu thích Python chủ yếu vì việc có quá nhiều thời gian tính toán hơn là quá nhiều thời gian để lập trình. Tôi sẵn sàng lãng phí chu kỳ CPU hơn là hy sinh một khoảng thời gian có thể dành cho thứ gì đó thú vị hơn.

Ngoài ra, +1 trên Julia. Tôi nghĩ rằng tôi có thể chuyển sang nó khi nó trở nên ổn định hơn và được hỗ trợ rộng rãi, tức là khi các mô-đun tiêu chuẩn được gói cho công việc tôi thích làm.


4

Đối với các ứng dụng khoa học của OCaml, xem ví dụ

Đối với Lisp trong khoa học, xem ví dụ

Tôi chắc chắn có nhiều tài liệu tham khảo hơn. Tuy nhiên, tôi không thể trích dẫn bất kỳ dự án nghiên cứu lớn nào trong đó công việc tính toán được thực hiện trong OCaml hoặc Lisp. Chọn một trong hai có nghĩa là làm việc trong sự cô lập tương đối.

Bạn cũng có thể quan tâm đến Julia , một ngôn ngữ mới cho điện toán khoa học hiện đang được phát triển, với những ảnh hưởng rõ ràng của Lisp.


1
Tôi có lẽ nên nói rõ hơn rằng tôi chủ yếu quan tâm đến trải nghiệm đầu tay. Tôi sẽ chỉnh sửa câu hỏi của tôi để phản ánh điều này.
Faheem Mitha
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.