Używanie niekonwencjonalnych języków programowania do obliczeń naukowych [zamknięte]

22

Uwaga: poniższy post może zawierać kontrowersyjne opinie, więc pamiętaj, że są to tylko moje opinie i nie mają na celu nikogo urazić.

Programuję w takiej czy innej formie od około 1999 roku. Początkowo używałem R, a potem, około 2004 roku, przełączyłem się głównie na Python.

Na przykład w wielu aplikacjach naukowych symulacja, w tym np. MCMC, zarówno R, jak i Python są zbyt wolne i należy je przyspieszyć. Zwykle jest to możliwe dzięki rozszerzeniu w C lub C ++. Zarówno dla R, jak i Pythona, właśnie to zrobiłem, używając R API C z C ++ i biblioteki Boost Python z Pythonem.

Jednak z różnych powodów ta kombinacja nie jest idealnym rozwiązaniem. Co jest ważne w programowaniu, szczególnie algorytmach? Ekspresyjność i szybkość, które są oczywiście powiązane. Im bardziej ekspresyjny jest język, tym szybciej można w nim pisać.

1) Jeśli chodzi o ekspresję, ani R, ani Python nie są moim zdaniem idealne do pisania algorytmów naukowych. Nie mapują ściśle algorytmu bazowego. Jednak oba są znacznie lepsze niż C ++.

2) Lubię pisać w języku Python, który jest przyjemnym językiem, chociaż, jak wspomniano powyżej, nie jest idealny do pracy algorytmicznej. Jednak gdy trzeba pracować z kombinacją Python / C ++ z powodu problemów z prędkością, ta mieszanka staje się znacznie mniej przyjemna w pracy. Zwykle dzieje się tak, że najpierw piszę w Pythonie, a gdy mam już coś, co działa dobrze, często odkrywam, że jest on zbyt wolny (dla niektórych subiektywnych wartości zbyt wolnych). Następnie podejmuję decyzję, czy poświęcić trochę nieuzasadnionego czasu na przepisywanie go w C ++, czy pogodzić się ze spowolnieniem. Z perspektywy czasu często wydaje mi się, że lepiej byłoby znosić powolność, zwłaszcza że uzyskane przyspieszenia są nieprzewidywalne. Ponadto interfejs Boost Python między nimi powoduje znaczny ból głowy związany z utrzymaniem, a sklejenie kodu w dwóch różnych językach jest po prostu rozpraszające. Brak krytyki dotyczącej Boost Pythona, jest on tak potężnym interfejsem, jak można sobie wyobrazić, i właściwie działa przez większość czasu.

Teraz, w idealnym świecie, z nieograniczonym czasem i zasobami, żaden z tych problemów nie byłby poważnym problemem. Jednak w projektach naukowych, nad którymi pracowałem, miałem następujące doświadczenie.

Bez względu na to, czy mam współpracowników przy projekcie, zawsze wydaje mi się, że wykonuję zdecydowaną większość obliczeń. W sumie 5 znaczących projektów miałem znaczący udział tylko jednej osoby w jednym projekcie. Ta jedna osoba zrobiła więcej niż tylko podniosła swój ciężar; zrobił tak samo jak ja lub więcej. Jednak we wszystkich innych przypadkach, w tym w projektach z wieloma współpracownikami, wykonałem (praktycznie) całą pracę obliczeniową. Chociaż mogę powiedzieć, że nie zostałem pobłogosławiony najlepszymi współpracownikami (wydaje się to mieszanką lenistwa i niekompetencji), nie jest dla mnie jasne, czy ten stan rzeczy może się zmienić w przyszłości.

Obliczeniowa praca naukowa to ogromny wysiłek, a jeśli nie mogę zmienić zachowania moich współpracowników, mogę zmienić sposób pracy. Najważniejsze ulepszenie polegałoby na szybszym wykonywaniu zadań. Co sprowadza mnie tutaj do głównej uwagi, a mianowicie, że zmiana języka na coś mniej ortodoksyjnego może pomóc. Na podstawie wcześniejszych badań najbardziej prawdopodobnymi kandydatami w kolejności prawdopodobieństwa są Common Lisp i Ocaml. Myślałem o tym od lat, ale ostatnio poważniej o tym myślałem.

O ile wiem, niewiele osób używa CL lub Ocaml do obliczeń naukowych. Podczas przeszukiwania tej witryny znalazłem dwa odniesienia do CL (jeden był mój) i jeden do Ocaml (mój). Przez lata miałem kilka zachęcających kontaktów z odważnymi ludźmi pracującymi na marginesie. W 2008 roku natknąłem się na recenzję książki „Practical Common Lisp” Petera Seibela (której jestem właścicielem) autorstwa Tamas K. Papp. To przykuło moją uwagę, ponieważ był to jeden z niewielu wzmianek o naukowym informatyce dla Lisp, z którym się spotkałem w sieci. Napisałem do Tamasa, który natychmiast odpowiedział pomocnie i zachęcająco. Cytując go

Moja produktywność programowa prawdopodobnie wzrosła dziesięciokrotnie wraz z Lispem, ale wydarzyło się to około roku i wciąż się uczę (chociaż po 2 miesiącach radziłem sobie całkiem nieźle). Więc jeśli pracujesz nad czymś krytycznym czasowo, odłóż przełącznik.

Powinieneś zastanowić się nad pytaniem ludzi o cll, nie jestem jedynym, który wie o tych rzeczach, inni zajmują się obliczeniami naukowymi na Lisp.

Ma także blog i stronę GitHub .

Inną osobą, z którą krótko korespondowałem (w grudniu 2006 r.) Była Ira Kalet , która używała Common Lisp w kontekście radioterapii onkologicznej.

Być może są inni, którzy zajmują się obliczeniami naukowymi na Lisp, ale nie znam nikogo.

Najczęstszym problemem, na który powołują się CL, jest brak bibliotek. Jest to poważny problem w obliczeniach ogólnego przeznaczenia, ale może nie być tak bardzo w obliczeniach naukowych, szczególnie od podstaw implementacji algorytmów. W szczególności przez większość czasu mogę uzyskać podstawową bibliotekę matematyczną, w tym funkcje rozkładu prawdopodobieństwa, wielowymiarową bibliotekę tablicową i podstawowy zestaw kontenerów, np. Map, set, list itp., Które znajdują się w standardowych bibliotekach C ++ i Python.

Wiem jeszcze mniej o Ocaml niż o CL, ale wrzuciłem to jako alternatywę. Jest podobno bardzo szybki, ma jedną darmową implementację francuskich naukowców i wydaje się być najbardziej przydatną z rodziny języków ML do obliczeń naukowych.

Podsumowując, zastanawiam się, czy inni mają z tym doświadczenie i jakie mają myśli, jeśli w ogóle.

EDYCJA: Najbardziej interesują mnie doświadczenia z pierwszej ręki w kontekście problemów, które omówiłem powyżej. Np. Jeśli używałeś Pythona i C ++ (lub R i C ++) i przeniosłeś się na bardziej niejasny język, byłbym najbardziej zainteresowany usłyszeniem o twoich doświadczeniach.

Faheem Mitha
źródło
2
Wymiana stosów służy do zadawania pytań, a nie do publikowania historii życia! Twoje pytanie brzmi: „Czy są jakieś naukowe projekty komputerowe wykorzystujące Common Lisp lub OCaml”, prawda?
khinsen
4
Zgadzam się, to brzmi trochę bardziej jak post na blogu, ale podoba mi się ta przesłanka. Czy jest jakaś szansa, że ​​możesz spróbować zmniejszyć to do 2-3 akapitów?
Aron Ahmadia
1
Zgodziłem się również. Komentarze i osobiste doświadczenia są dobre, gdy wspierają główne pytanie; zbyt wiele szczegółów może zniszczyć główne punkty. Jeśli potrafisz skondensować swoje pytanie, myślę, że łatwiej byłoby je przeczytać i uzyskałoby bardziej ukierunkowane odpowiedzi o wyższej jakości.
Geoff Oxberry
1
@FaheemMitha: W „idealnym świecie”, o którym wspominasz w połowie, byłoby to zoptymalizowany ręcznie montaż… Brzmi dla mnie ponuro!
meawoppl
3
@ FaheemMitha: Myślę, że najlepszą rzeczą, jaką możesz zrobić, aby poprawić swoje pytanie, jest wyjaśnienie pytania, które zadajesz. Wygląda na to, że opowiadasz historię o swoich doświadczeniach (co jest w porządku), a na końcu zakopujesz pytanie jako wypowiedź na końcu swojej historii. („Podsumowując, zastanawiam się ...”) Najlepszą rzeczą, jaką możesz zrobić, jest uczynienie tej części pytaniem, aby ludzie przeglądający twoje pytanie mogli łatwo zidentyfikować to, o co pytasz. Musiałem wrócić kilka razy, żeby to rozgryźć.
Geoff Oxberry

Odpowiedzi:

18

Opracowaliśmy Julię z dokładnie przedstawionych powodów. Po prostu nie było dobrego naukowego języka komputerowego na wysokim poziomie, który zapewniałby wystarczającą wydajność, więc nie trzeba było ciągle przepisywać części kodu w C / Fortran. Projekt Julii ma duży wpływ na seplenienie, więc możesz go polubić, podczas gdy twoi współpracownicy mogą traktować go jak matlab lub R, jeśli nie dbają o części funkcjonalne. Minusem jest to, że język jest nowy i nie ma jeszcze wszystkich bibliotek potrzebnych do codziennego użytkowania.

Mark, chciałbym dodać Julię do swojego testu porównawczego, aby zobaczyć, jak sobie radzimy. Przejdź na naszą listę mailingową i daj nam znać, co chcesz zobaczyć w Julii, aby była dla Ciebie bardziej przydatna.

Viral B. Shah
źródło
To wygląda pięknie! Na pewno to sprawdzę pod kątem własnej pracy. Obecnie używam Pythona do całej mojej pracy w teoretycznej materii skondensowanej, tylko dlatego, że czas uzyskany dzięki szybkiemu kodowi C ++ jest negowany przez czas spędzony na pisaniu w C ++ w pierwszej kolejności :)
Lagerbaer
9

Szybkość, rozmiar i niezawodność języków programowania naprawdę dobrze rozwiązuje wiele różnych problemów wyrażonych w „pytaniu”. Porównuje szybkość i rozmiar bazy kodu wielu implementacji tych samych testów porównawczych w 33 językach!

Stałem się miłośnikiem Pythona głównie dlatego, że o wiele częściej występuje nadmiar czasu obliczeniowego niż nadmiarowego czasu na programowanie. Jestem bardziej niż chętny zmarnować cykle procesora niż poświęcić kawałek czasu, który można by poświęcić na coś bardziej interesującego.

Również +1 dla Julii. Myślę, że mogę się na to przełączyć, kiedy stanie się on trochę bardziej stabilny i szeroko wspierany, tj. Gdy zostaną zapakowane standardowe moduły do ​​pracy, którą lubię.

meawoppl
źródło
4

Dla naukowych zastosowań OCaml, patrz na przykład

Jeśli chodzi o Lisp w nauce, patrz na przykład

Jestem pewien, że jest o wiele więcej referencji. Nie mogę jednak przytoczyć żadnego dużego projektu badawczego, w którym prace obliczeniowe zostały wykonane w OCaml lub Lisp. Wybór jednego z nich oznacza pracę we względnej izolacji.

Być może zainteresuje Cię także Julia , nowy język dla naukowego przetwarzania danych, z wyraźnym wpływem Lispa.

Khinsen
źródło
1
Być może powinienem był wyjaśnić, że najbardziej interesują mnie doświadczenia z pierwszej ręki. Przeredaguję moje pytanie, aby to odzwierciedlić.
Faheem Mitha