Najlepsze języki do obliczeń naukowych [zamknięte]


10

Wydaje się, że w większości języków dostępna jest pewna liczba naukowych bibliotek komputerowych.

  • Python ma Scipy
  • Rust ma SciRust
  • C++ma kilka, w tym ViennaCLiArmadillo
  • Javama, Java Numericsa Colttakże kilka innych

Nie wspominając już o językach podobnych Ri Juliazaprojektowanych specjalnie do obliczeń naukowych.

Przy tak wielu opcjach, jak wybrać najlepszy język dla zadania? Ponadto które języki będą najbardziej wydajne? Pythoni Rwydaje się, że ma największą przyczepność w przestrzeni, ale logicznie skompilowany język wydaje się lepszym wyborem. I czy coś kiedykolwiek osiągnie lepsze wyniki Fortran? Dodatkowo języki skompilowane mają przyspieszenie GPU, podczas gdy języki interpretowane lubią Ri Pythonnie. Co powinienem wziąć pod uwagę przy wyborze języka i które języki zapewniają najlepszą równowagę użyteczności i wydajności? Czy są też języki, w których brakuje znaczących naukowych zasobów komputerowych?

efficiency  statistics  tools  knowledge-base  machine-learning  neural-network  deep-learning  optimization  hyperparameter  machine-learning  time-series  categorical-data  logistic-regression  python  visualization  bigdata  efficiency  classification  binary  svm  random-forest  logistic-regression  data-mining  sql  experiments  bigdata  efficiency  performance  scalability  distributed  bigdata  nlp  statistics  education  knowledge-base  definitions  machine-learning  recommender-system  evaluation  efficiency  algorithms  parameter  efficiency  scalability  sql  statistics  visualization  knowledge-base  education  machine-learning  r  python  r  text-mining  sentiment-analysis  machine-learning  machine-learning  python  neural-network  statistics  reference-request  machine-learning  data-mining  python  classification  data-mining  bigdata  usecase  apache-hadoop  map-reduce  aws  education  feature-selection  machine-learning  machine-learning  sports  data-formats  hierarchical-data-format  bigdata  apache-hadoop  bigdata  apache-hadoop  python  visualization  knowledge-base  classification  confusion-matrix  accuracy  bigdata  apache-hadoop  bigdata  efficiency  apache-hadoop  distributed  machine-translation  nlp  metadata  data-cleaning  text-mining  python  pandas  machine-learning  python  pandas  scikit-learn  bigdata  machine-learning  databases  clustering  data-mining  recommender-system 

12
Tu nie ma pytania. Jeśli potrzebujesz podstawowych badań nad językiem programowania, lepiej jest przeczytać Wikipedię, niż poczekać, aż ktoś pojawi się tutaj i popchnie swojego konia hobby.
Dirk Eddelbuettel

@DirkEddelbuettel Bardzo dobry punkt. Pomyślałem, że lepiej jest spróbować tworzyć treści niż udoskonalać je w tym momencie w wersji Beta, ale nie wiem zbyt wiele o betach SE. Czy to był dobry ruch z mojej strony, czy nie?
indico

1
Spójrz na te liczby.
Emre

@DirkEddelbuettel się nie mylisz, ale mam nadzieję, że poprowadzę dyskusję na temat użytecznych cech i narzędzi związanych z różnymi językami. Język, którego używasz, jest ważnym narzędziem w nauce o danych, więc pomyślałem, że ludzie mogą dyskutować o preferowanych narzędziach i mają tutaj obiektywne korzyści, jako źródło informacji dla osób, które chcą podjąć podobną pracę.
ragingSloth

1
@indico Spróbuj cran.r-project.org/web/packages/overlap/index.html, który jest pierwszym, który wybrałem losowo. Ale tak naprawdę, osobiście znałem wielu statystyk, którzy napisali pakiety R. Żaden z nich nie napisał jeszcze pythonowego. Aby nieco rozszerzyć rozmowę, kdnuggets.com/2013/08/… jest interesujący.
Lembik

Odpowiedzi:


12

To dość masywne pytanie, więc nie jest to pełna odpowiedź, ale miejmy nadzieję, że może to pomóc w poinformowaniu ogólnej praktyki związanej z określeniem najlepszego narzędzia do pracy, jeśli chodzi o analizę danych. Ogólnie mam stosunkowo krótką listę kwalifikacji, których szukam, jeśli chodzi o dowolne narzędzie w tej przestrzeni. W żadnej określonej kolejności nie są:

  • Wydajność : Zasadniczo sprowadza się do tego, jak szybko język pomnaża macierz, ponieważ jest to mniej lub bardziej najważniejsze zadanie w informatyce.
  • Skalowalność : Przynajmniej dla mnie sprowadza się to do łatwości budowy systemu rozproszonego. To jest miejsce, w którym języki Julianaprawdę błyszczą.
  • Społeczność : W dowolnym języku naprawdę szukasz aktywnej społeczności, która może Ci pomóc, gdy utkniesz przy użyciu dowolnego narzędzia, którego używasz. To jest miejsce, które pythonwyprzedza większość innych języków.
  • Elastyczność : nie ma nic gorszego niż ograniczenie języka, którego używasz. Nie zdarza się to często, ale próba reprezentowania struktur graficznych haskelljest znanym bólem i Juliajest wypełniona wieloma problemami związanymi z architekturą kodu w wyniku bycia tak młodym językiem.
  • Łatwość użycia : jeśli chcesz użyć czegoś w większym środowisku, upewnij się, że konfiguracja jest prosta i może zostać zautomatyzowana. Nie ma nic gorszego niż konieczność skonfigurowania drobnej wersji na pół tuzinie maszyn.

Istnieje mnóstwo artykułów na temat wydajności i skalowalności, ale ogólnie będziesz patrzył na różnicę wydajności wynoszącą może 5-10x między językami, co może, ale nie musi mieć znaczenia, w zależności od konkretnej aplikacji. Jeśli chodzi o przyspieszenie GPU, cudamatjest to naprawdę bezproblemowy sposób na rozpoczęcie pracy python, a cudabiblioteka ogólnie sprawiła, że ​​przyspieszenie GPU jest znacznie bardziej dostępne niż kiedyś.

Dwie podstawowe miary, których używam zarówno dla społeczności, jak i elastyczności, to spojrzenie na menedżera pakietów języka i pytania językowe w witrynie takiej jak SO. Jeśli istnieje wiele pytań i odpowiedzi wysokiej jakości, to dobry znak, że społeczność jest aktywna. Liczba pakietów i ogólna aktywność na tych pakietach mogą być również dobrym proxy dla tej metryki.

Jeśli chodzi o łatwość użytkowania, jestem głęboko przekonany, że jedynym sposobem, aby wiedzieć, jest faktyczne skonfigurowanie go samemu. Istnieje wiele przesądów w związku z wieloma narzędziami Data Science, w szczególności takimi jak bazy danych i architektura rozproszonego przetwarzania danych, ale nie ma sposobu, aby naprawdę wiedzieć, czy coś jest łatwe lub trudne do skonfigurowania i wdrożenia bez budowania go samodzielnie.


Aby dodać do tej odpowiedzi: pod względem skalowalności Scalai Gowarto wspomnieć.
Marc Claesen,

Dodałbym jasności i zwięzłości (związanych ze składnią i architekturą językową, ale nie tylko). Możliwość szybkiego pisania i czytania bez bólu stanowi ogromną różnicę (ponieważ czas programistów jest droższy niż czas maszynowy).
Piotr Migdal

5

Najlepszy język zależy od tego, co chcesz zrobić. Pierwsza uwaga: nie ograniczaj się do jednego języka. Nauka nowego języka jest zawsze dobrą rzeczą, ale w pewnym momencie będziesz musiał wybrać. Udogodnienia oferowane przez sam język są rzeczą oczywistą, którą należy wziąć pod uwagę, ale moim zdaniem ważniejsze są:

  • dostępne biblioteki : czy musisz wszystko zaimplementować od zera, czy możesz ponownie wykorzystać istniejące rzeczy? Zauważ, że biblioteki te nie muszą być w jakimkolwiek języku, który rozważasz, o ile możesz łatwo interfejsować. Praca w języku bez dostępu do biblioteki nie pomoże ci załatwić sprawy.
  • liczba ekspertów : jeśli chcesz zewnętrznych programistów lub rozpocząć pracę w zespole, musisz rozważyć, ile osób faktycznie zna język. Jako skrajny przykład: jeśli zdecydujesz się na pracę w Brainfuck, bo ci się to podoba, wiedz, że prawdopodobnie będziesz pracować sam. Istnieje wiele ankiet, które mogą pomóc ocenić popularność języków, w tym liczbę pytań na język w SO.
  • toolchain : czy masz dostęp do dobrych debuggerów, profilerów, narzędzi dokumentacji i (jeśli jesteś w to) IDE?

Wiem, że większość moich argumentów przemawia za uznanymi językami. Jest to z perspektywy „załatwienia sprawy”.

To powiedziawszy, osobiście uważam, że o wiele lepiej jest biegle posługiwać się językiem niskiego poziomu i językiem wysokiego poziomu:

  • niski poziom: C ++, C, Fortran, ... za pomocą którego można zaimplementować pewne hotspoty profilowania tylko wtedy, gdy jest to konieczne, ponieważ programowanie w tych językach jest zwykle wolniejsze (choć jest to przedmiotem dyskusji). Języki te pozostają królem wzgórza pod względem wydajności krytycznej i prawdopodobnie pozostaną na szczycie przez długi czas.
  • wysoki poziom: Python, R, Clojure, ... aby „skleić” rzeczy razem i robić rzeczy krytyczne niezwiązane z wydajnością (przetwarzanie wstępne, przetwarzanie danych, ...). Uważam, że jest to ważne po prostu dlatego, że o wiele łatwiej jest szybko opracowywać i tworzyć prototypy w tych językach.

4

Najpierw musisz zdecydować, co chcesz zrobić, a następnie poszukaj odpowiedniego narzędzia do tego zadania.

Bardzo ogólnym podejściem jest użycie R dla pierwszych wersji i sprawdzenie, czy twoje podejście jest poprawne. Brakuje mu trochę prędkości, ale ma bardzo potężne polecenia i biblioteki dodatków, dzięki którym można wypróbować prawie wszystko: http://www.r-project.org/

Drugi pomysł jest taki, że jeśli chcesz zrozumieć algorytmy bibliotek, możesz rzucić okiem na Przepisy numeryczne. Są one dostępne w różnych językach i bezpłatne do nauki. Jeśli chcesz używać ich w produktach komercyjnych, musisz zakupić licencję: http://en.wikipedia.org/wiki/Numerical_Recipes

Przez większość czasu wydajność nie będzie problemem, ale znalezienie odpowiednich algorytmów i parametrów dla nich, dlatego ważne jest, aby mieć szybki język skryptowy zamiast programu potwora, który najpierw musi skompilować 10 minut przed obliczeniem dwóch liczb i wyłożeniem wynik.

Dużym plusem przy korzystaniu z R jest to, że ma wbudowane funkcje lub biblioteki dla prawie każdego rodzaju diagramu, który może być potrzebny do wizualizacji danych.

Jeśli masz wtedy działającą wersję, prawie łatwo jest przenieść ją na inny język, który Twoim zdaniem jest bardziej wydajny.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.