Warum Python nicht C? [geschlossen]


7

Ich mag die erzwungene Einrückung von Python, die viele nicht mögen, weil ich das Schreiben in Klammern und redundante Semikolons hasse. Ich mag die Shell-Oberfläche, aber warum denken manche, dass Python de facto für maschinelles Lernen geeignet ist ?

Selbst bei einer gerade gleichgerichteten linearen Aktivierung stellt die Simulation von Schaltkreisen aus künstlichen Neuronen aufgrund der bloßen Dimensionalität hohe Anforderungen an die Rechenressourcen. Die Verarbeitung von Videos in einem typischen gegnerischen künstlichen Netzwerkalgorithmus erfordert sieben verschachtelte Schleifen.

  • Widersprüchliche Paariteration
  • Tiefe der neuronalen Netzschicht
  • Beispielindex
  • Rahmenindex
  • Pixeltiefe
  • Vertikale
  • Horizontal

Wir nennen den Filter für die Faltung einen "Kernel" und verpfänden ihn an DSPs in GPUs, um die Leistung zu verringern, und verwenden dann eine Skriptsprache zum Codieren.

Warum sollten wir keinen Deep-Learning-Code schreiben, wie Linus Torvalds Kernel-Code mit schreibt? gcc -S damit wir sicherstellen können, dass die Assemblersprache effizient ist und fast keine Cache-Fehler auftreten? Unter Performance-Gesichtspunkten konnte man mit C zum Mond und zurück fliegen, bevor Python überhaupt die Baumgrenze durchbrach.

In Bezug auf das einfache Experimentieren ist C ++ viel objektorientiert, so dass saubere Abstraktionen als .hpp-Dateien geschrieben werden können, um das kerneffiziente C zu konfigurieren und zu steuern, das die Mechanik der Parameteroptimierung übernimmt.

Wir tippen auf Tastaturen, um Code und Block zu schreiben, wir programmieren Mikrowellenherde und einige von uns spielen musikalische Tastaturen, die Klaviere gut simulieren. Wir vergessen dann, dass es C / C ++ unter diesen sehr intuitiven Benutzeroberflächen ist. Ich kaufe ehrlich gesagt das Python-Argument noch nicht.

Die meisten von uns verstehen, dass Python-Wrapper um die in FORTRAN geschriebenen und nach C portierten effizienten Matrixalgorithmen erstellt wurden und dass die Python-Konstrukte für ML relativ elegant sind. Dies ist jedoch ein guter Grund, die Tatsache zu verwerfen, dass viele C ++ - Bibliotheken für ML vorhanden sind das sind auch elegant entwickelt worden?


2
Meiner Meinung nach war Pythons Hauptvorteil immer, dass es sich um eine interpretierte Sprache handelt, die eine Art Entwicklungsflexibilität / -fluidität bietet, die Sie mit kompilierten Sprachen einfach nicht erreichen.
DukeZhou

Python ist einfacher als c und Sie können Python mehr als v verwenden
AIDANMAKU

Python ist leicht zu verstehen. Wir brauchen mehr Köpfe, um Probleme zu lösen. Mit Python können mehr Menschen lernen und die Community wächst.
Guilherme IA

Ähnliche Frage äußerlich: quora.com/Why-is-C++-not-a-good-language-for-machine-learning . Ab dem 22. Juli 2018 verfügt Github.com über 1.657 Projekte in C ++ für maschinelles Lernen: github.com/… . Tensorflow ist einer von ihnen. Es gibt wissenschaftliche Artikel für C ++ ML-Ansätze: MLC ++, DLibML, MLPack, LibDAI, Showgun, Bob, OptiML und einige hundert weitere ( Scholar.google.com/scholar?q=machine+learning+c%2B%2B ).
FauChristian

Antworten:


4

Weil es für Python eine Bibliothek namens NumPy gibt .

Es kann extrem schnelle Berechnungen auf n-dimensionalen Arrays von Zahlen durchführen, und alle Arten von Bibliotheken für wissenschaftliches / maschinelles Lernen / Bildverarbeitung usw. sind darauf aufgebaut.

Sie führen in Python keine eigentlichen Berechnungen durch for Schleifen durch, das ist sehr langsam. Sie nennen Numpy-Matrix-Operationen, und sie sind selbst in C geschrieben (und teilweise in Fortran, wenn ich mich richtig erinnere, nicht sicher, ob dies immer noch der Fall ist) und im Laufe der Jahre gnadenlos auf Geschwindigkeit optimiert.


4

Das, wonach Sie wahrscheinlich suchen, ist:

Geben Sie hier die Bildbeschreibung ein

Lassen Sie uns diese Frage aus zwei Blickwinkeln betrachten:

Anfänger: Aus Sicht des Anfängers muss er verstehen, wie ein Modell implementiert wird, bevor es optimiert wird. Er muss zuerst das Modell visualisieren, die Arten von Fehlern erkennen, die sich einschleichen, und mit dem Modell experimentieren, um mehr Intuition zu erlangen. Sicherlich möglich in C / C ++. Aber ist es das wert? Die Zeit, die die Person zum Schreiben / Debuggen des Codes in C / C ++ benötigt, überwiegt bei weitem die Zeit zum Erstellen von i in Python / MATLAB / R. Nachdem er einige Kenntnisse in der Zwischenimplementierung erworben hat, kann er mit C / C ++ fortfahren.

Experten: Mit Experten meine ich Programmierexperten. Sie verwenden mit Sicherheit und einfach C / C ++. Die wichtigsten Informationen, die Sie verpasst haben, sind TensorFlow, eine eigenständige ML-Bibliothek, die auch als Kern für andere hochrangige ML-Bibliotheken dient, z. B. Keras, das in C ++ selbst programmiert ist. Hier gibt es mehr Infos dazu. Wenn ich mich nicht irre, erstellt TensorFlow vor der Aufnahme von Daten ein Berechnungsdiagramm und führt dieses Diagramm dann für die Daten aus, die im Allgemeinen vollständig in den RAM geladen sind . Also keine Interferenz von Python dazwischen.

Auch die Lesbarkeit von Code ist ein großes Problem (zumindest sehe ich mich damit konfrontiert). Das Schreiben eines ML-Algorithmus in C / C ++ erfordert große Mengen an Code, die möglicherweise unlesbar werden, wenn Sie sie nach etwa einer Woche betrachten, wenn sie nicht gut dokumentiert sind. Aufgrund der eingebauten Python-Funktionen können Sie das Programm leicht lesen.

Ratschläge des Experten für maschinelles Lernen, Andrew Ng, verwenden Sie Sprachen wie C / C ++, um Ihr Modell zu implementieren, sobald Sie überprüft haben, dass Ihr Modell in einer höheren Sprache wie MATLAB funktioniert.

Da die von @FauChristian erwähnte Bibliotheksunterstützung einwandfrei ist, können Sie verschiedene andere Bibliotheken in anderen Feldern kombinieren, um Daten in ein ML-Formular zu konvertieren, das dann in Ihrem ML-Modell verwendet wird.


2

In der KI (und wahrscheinlich auch in vielen anderen Bereichen) ist die von den menschlichen Programmierern verbrachte Zeit in der Regel wesentlich wertvoller / teurer als die Zeit, die für die Ausführung eines Programms aufgewendet wird. Natürlich ist dies nicht immer der Fall (genauso wie es nicht immer der Fall ist, dass Python anstelle von C oder C ++ verwendet wird), aber es ist oft wahr.

Gerade bei der Forschung ist es äußerst wichtig, Ideen schnell durchlaufen zu können. Wir müssen in der Lage sein, neue Ideen schnell umzusetzen, zu testen, wahrscheinlich einige Iterationen von Bugfixing zu durchlaufen, erneut zu testen usw. Es ist ziemlich selten, dass der Engpass bei dieser Iteration von Ideen die Laufzeit einer neuen Idee / eines neuen Algorithmus ist. Die Programmierzeit des Menschen ist viel häufiger ein Engpass. Ideen können oft schnell auf kleine Spielzeugprobleme getestet werden, die ohnehin nicht viel Laufzeit benötigen, oder über Nacht ausgeführt werden, während der Programmierer damit beschäftigt ist, anderen Code zu schreiben.

Das ganze Iterieren, schnelle Implementieren neuer Ideen usw. ist in Python in der Regel einfacher / schneller als in C oder C ++. Dies gilt natürlich nicht unbedingt für alle. Wenn jemand bereits viel Erfahrung in C ++ und wenig Erfahrung in Python hat, kann er möglicherweise neue Ideen schneller in C ++ implementieren. Dies scheint jedoch bei der Mehrheit der Menschen nicht der Fall zu sein. Zu den klaren Vorteilen, die Python in Bezug auf die schnelle Umsetzung neuer Ideen hat, gehören:

  • Weniger ausführlich, müssen Sie nicht so viel eingeben (z. B. results = []in Python oder std::vector<double> results;in C ++, um eine leere Liste zu erstellen, an die wir in einem Experiment einige Ergebnisse anhängen können).
  • Keine Notwendigkeit, sich um Speicherverwaltung, Zeiger, all das zu kümmern, was mit Erfahrung machbar ist, aber unweigerlich Aufmerksamkeit erfordert, hat eine größere Wahrscheinlichkeit, zu zusätzlichen Fehlern usw. zu führen.
  • Keine Notwendigkeit, den Kompilierungs- / Erstellungsprozess zu durchlaufen . Dies kann sehr groß sein, was leicht zu vergessen ist.
  • Viel weniger mühsam, Datenstrukturen zu haben, die Dinge unterschiedlichen Typs enthalten (z. B. config = {'algorithm': 'RandomForest', 'n_trees': 50}in Python vs .... keine Ahnung in C ++)

Ein weiterer wichtiger Punkt ist, dass der Großteil des Codes, den Menschen in AI schreiben, nicht die leistungsabhängigen Teile sind . Auch dies gilt möglicherweise nicht für alle, gilt jedoch insbesondere für Forschungsumgebungen. Die meisten Forscher verbringen den größten Teil ihrer Zeit nicht damit, Code für Vorwärts- / Rückwärtsdurchläufe in einem neuronalen Netzwerk zu schreiben. Sie verbringen viel mehr Zeit mit Dingen wie:

  • Vorverarbeitung von Daten (nicht immer einfach zu schreibender, leicht wiederverwendbarer Code, wichtige Teile sind projektspezifisch / datensatzspezifisch)
  • Versuchsaufbau (zB äußere Trainingsschleifen, Druck- / Protokollierungsergebnisse, ...)
  • Verarbeiten von Ergebnissen, Erstellen aller Arten von ausgefallenen Plots usw.
  • Brandneue (Teile von) Algorithmen (z. B. eine neue Variante in der Liste von SGD / RMSProp / ADAM / etc., Wahrscheinlich nur ein paar Zeilen einfachen Codes, die direkt in ein vorhandenes Framework eingefügt werden können, mit viel mehr Stift- und Papiermathematik dahinter).

Nun, dieser letzte Punkt kann in einigen Fällen leistungsabhängig sein, aber das anfängliche Problem wird nicht die Leistung sein. Die anfängliche Sorge wird sein; wird es überhaupt funktionieren? Dies kann bei einfacheren Problemen oder bei weniger leistungsfähigem Code ausgewertet werden, indem einfach etwas länger gewartet wird. Es ist jedoch noch wichtiger, ihn zuerst implementieren zu können. Wie in anderen Antworten erwähnt, können diese dank C-basierter Frameworks wie Tensorflowund numpyauch von Python aus oftmals performant sein.


Schließlich ist die Existenz bekannter, benutzerfreundlicher, etablierter Open-Source-Bibliotheken und Frameworks, die sich im Laufe der Zeit bewährt haben, äußerst wichtig. In Python haben wir:

  • Numpy
  • Pandas
  • Matplotlib, Seaborn
  • scikit-lernen
  • Tensorflow, Pytorch
  • XGBoost

Wiederum haben viele davon Teile in C / C ++ implementiert, wenn es auch um die Leistung geht.


Wenn ich über Forschung spreche, bedeutet dies nicht nur "Wissenschaft". KI in der Industrie hat auch oft einen gewissen Forschungsgeschmack. Es ist unwahrscheinlich, dass Menschen in der Industrie neuronale Netze immer und immer wieder von Grund auf neu implementieren. Es ist viel wahrscheinlicher, dass sie Implementierungen wiederverwenden, die bereits effizient sind (z. B. Tensorflow), aber versuchen, sie auf neue Daten anzuwenden (wo sie einen neuen Code für das Boilerplate schreiben müssen, was schnell und einfach ist in Python) oder versuchen Sie es mit neuen Architekturen oder versuchen Sie, Daten und / oder Ergebnisse usw. zu visualisieren.


4
@DouglasDaseeco Vielleicht ist das speziell für Sie der Fall, aber meistens ist es nicht der Fall. Die Verwendung eines Tesla P100 aus Europa / Asien in der Google Cloud kostet derzeit 1,60 US-Dollar pro Stunde. Wenn Sie die Wahl haben, ein paar GPUs mehr zu mieten oder einen zusätzlichen Entwickler einzustellen, weil alle Ihre Entwickler langsamer sind, weil sie in C ++ anstatt in Python arbeiten müssen, sind die zusätzlichen GPUs oft billiger. Ein Teil des Punktes bei Mehrfachantworten ist jedenfalls, dass dies oft nicht einmal eine relevante Wahl ist. Leistungsempfindliche Teile können (und werden häufig) problemlos in C ++ implementiert werden (z. B. Numpy, Tensorflow)
Dennis Soemers

@DouglasDaseeco Richtig, und wenn es in Python eingefügt wird, können Entwickler alle Vorteile von Python nutzen, ohne Leistungseinbußen (oder zumindest bei deutlich geringeren Leistungseinbußen).
Dennis Soemers

1

Der Hauptgrund für die Bevorzugung von Python ist der Overhead. C ++ bedeutet automatisch einen höheren Overhead in Bezug auf die Menge an Code, die für bestimmte Aufgaben erforderlich ist. Künstliche Intelligenz ist konzeptionell bereits schwer zu verstehen, was den Programmieraufwand zu einem größeren Problem macht.

Da C ++ - Module eine Möglichkeit sind, die Python-Sprache zu erweitern, gibt es kaum einen Grund, Python nicht zu verwenden. Es ist einfacher, Programmierkenntnisse in C ++ auf Python zu übertragen, als eine Möglichkeit zu finden, eine Bibliothek in C ++ so zu programmieren, dass sie dem aktuellen Wissensbestand entspricht, der bereits in Python enthalten ist.


Die "C / C ++ - Module", auf die ich mich beziehe, sind Teil der Python-Erweiterbarkeit und nicht der C / C ++ - Sprache. Wo und wann diese Funktionen vor Python entstanden sind, ist dies möglicherweise ein wenig unangebracht in Bezug auf die ursprüngliche Frage "Warum Python, nicht C?" Dies betrifft eher das maschinelle Lernen in Python im Vergleich zu C ++ als dessen Verlauf. Wenn Sie zu "Kann es gemacht werden?" Argument, ich werde zugeben, dass es sicherlich kann. Mein Argument war eher ein "Sollte es getan werden?" Argument, das auf die Tatsache hinweist, dass es möglicherweise einen größeren Programmieraufwand erfordert, um dasselbe in C / C ++ mit Python zu tun.
Nathan Eggers Techno Tech Blog

1

Python ist aus mehreren Gründen für Rapid Prototyping beliebt.

  • Es ist eine Plattform mit einer Shell wie Mathematica und MATLAB
  • Es hat Matrix und andere mathematische Typen eingebaut
  • Im Gegensatz zu diesen proprietären Plattformen ist es kostenlos
  • Die Bibliotheken im ML-Bereich sind derzeit ausgereifter als SciLab

Möglicherweise auch ein Faktor: Python ist heute die am häufigsten unterrichtete Einführungssprache (siehe z . B. cacm.acm.org/blogs/blog-cacm/… ). Das liegt wahrscheinlich an den Gründen, die Sie hier angeben, und hilft auch dabei, die Erstellung und Wartung von ML-Bibliotheken voranzutreiben.
John Doucette

@ JohnDoucette, ich finde es gut, dass es als Einführungssprache weit verbreitet ist, weil Pylint Einrückungen erzwingt. Ich kann nicht einmal den Java- oder C ++ - Code anderer Leute betrachten, ohne einen Code-Formatierer darauf auszuführen.
FauChristian

1

Denn während C / C ++ nicht tot ist , sind sie schwer zu bedienen und schwer zu lernen. Früher mochte ich sie, aber jetzt würde mich niemand dazu bringen, etwas mit Funktionen wie undefiniertem Verhalten zu lernen . Auf keinen Fall! Speicherverwaltung? Warum sollte ich? Ich möchte einfach nicht meine Zeit mit solchen Dingen verschwenden ... und ich denke, das ist die übliche Einstellung unter Studenten.

Es wird immer Leute geben, die "das alte gute niedrige C" lieben, und das ist gut so, denn wir brauchen Kernel und Treiber und so. Es hat seinen Platz.

C ++ ist ein höheres Level, aber für die meisten von uns, die lieber Zeit mit Algorithmen als mit der Sprache selbst verbringen, ist es viel zu kompliziert geworden.

Alles, was vernünftigerweise mit weniger Aufwand getan werden kann, sollte nicht mit mehr Aufwand getan werden. Ich habe C ++ jahrelang (vor einiger Zeit) verwendet und nur ein paar Stunden mit Python verbracht, aber ich habe mich wegen der Effizienz der Codierung immer für ein paar tausend Zeilen Projekt entschieden.

Die Effizienz der Ausführung kann später verbessert werden, möglicherweise sogar durch Umschreiben eines kleinen Teils in C ++. Oft kann durch die Implementierung eines intelligenteren Algorithmus mehr erreicht werden.


Ich bin mir nicht sicher, ob sie schwer zu lernen sind. Mein erstes UNIX-Programm war hello.c von Kernighan & Ritchie. Dann habe ich den Rest des Buches in einer Stunde gescannt und bis Ende dieser Woche eine Reihe von Analyseprogrammen geschrieben. Ich habe C ++ gelernt, indem ich Stroustrup in 3 Arbeitstagen genauer gelesen habe. Es war dann einfach, vor dem Ende des vierten Tages ein Simulationsprogramm zu schreiben. ~~ Es kann sein, dass Python wie MATLAB abstrahiert ist, aber meine Kreditkarte nicht benötigt. ~~ Außerdem laufen die Pythonisten des Silicon Valley bei jeder Veranstaltung mit wirklich tollen T-Shirts durch das Moscone Center.
FauChristian
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.