Python leicht zu durchschauen – These oder Wirklichkeit ?

Gestern Abend habe ich (als .NET Programmierer) mir einen Vortrag über Python, eine der neuen Hype Sprachen, angeschaut.

Hiefür vielen Dank an Rainer Schuster, der im Rahmen des wöchentlichen ONLINE Stammtisches der .NET Online Usergroup, diesen Vortrag gehalten hat.

Ich hatte mich mit dieser Programmiersprache bisher noch gar nicht auseinander gesetzt, so dass ich mir, nachdem ich mit den gestrigen Vortrag angesehen habe, heute noch ein wenig mehr Informationen besorgt habe um evtl. den Hype um diese Sprache besser verstehen zu können.

Vorweg, kann ich schon mal sagen, dass mir das nicht gelungen ist, und ich nicht verstehen kann, was an einer interpretierten Sprache ohne Verwendung von Klammern so viel besser sein soll, als bei anderen Sprachen die nicht interpretiert werden müssen, und Ihre Konstrukte mithilfe von Klammern darstellt.

Auf diesen Satz mit den Klammern komme ich weil unter anderem über Python folgendes Gesagt wird:

Leicht zu durchschauen

Python hat noch einen weiteren, für Anfänger interessanten Aspekt: Die Syntax der Sprache wird weniger von Klammern als von Zeilenumbrüchen und Tabulatoren bestimmt. Man erkennt schnell, wie das Programm aufgebaut ist und gewinnt auch bei Programmen anderer Entwickler schnell einen Überblick.

Was ist denn an diesem Quellcode leichter  zu verstehen:

for i in range (10):
 print i
 print "zähle noch
for i in range (10):
 print i
print "Hallo"

Als an diesem (Beipiel C# Code)

for (int i = 0; i < 10; i++)
{
    Console.Write(i);
    Console.Write(@"Zähle noch")
}
for (int i = 0; i < 10; i++
{
    Console.Write(i);
}
Console.Write(@"Hello World");

OK OK OK,

das ist nicht alles, Python ist (Hier Argumente von Python Jüngern):

  • Open Source
  • Auf einigen (vielen) Plattformen (darunter auch ein paar exotische) verfügbar
  • Von vornherein auf Objektorientierung ausgelegt (Welchen Vorteil das auch immer mit sich bringen soll)

Auf der anderen Seite muss man doch aber auch ganz klar sehen, wen Python als Platzhirsch ansieht:

Das sind PHP und Pearl, nicht gerade die klassischen .NET Sprachen

Ist Python also die Sprache der Zukunft für uns .NET Entwickler?

Ich denke nein.

Es wird zwar gesagt, man kann mit Python alle arten von Programmen schreiben kann, das wird wohl auch nicht falsch sein.

Aber möchte ich demnächst

  • Desktop Applikationen
  • Web Portale
  • Web Services
  • Windows Dienste
  •  WP7 Apps
  • Android Apps

mit Python entwickeln.

Ich denke, dass ich das nicht möchte. Mir graust sogar davor wenn mir jemand sagen würde er hätte vor mit Python (einem Interpretativen Sprache) einen Windows Dienst, einen Mail Server oder einen Web Service zu schreiben.

Ich bin mir nicht sicher und es lässt Platz für Spekulationen und vermutlich auch für heiße Diskussionen , aber ich denke, dass Python wohl eher im nicht Windows Umfeld seinen rechten Platz hat.

Ich möchte zum Schluss noch eines anmerken:

Auch wenn .NET in den nächsten Jahren an Gewicht verlieren, und das ganze mehr in Richtung HMTL 5, 6 oder 7 zusammen mit JavaSript oder was für einer, mehr oder weniger funktionalen oder prozeduralen Sprache schwenken könnte, werde ich als heutiger .NET Entwickler vermutlich eher in diesen heute noch nicht endgültig abzuzeichnenden Bereich, als zu Python wechseln.

17 Gedanken zu „Python leicht zu durchschauen – These oder Wirklichkeit ?“

  1. Hallo,

    so unsachlich wie dein Artikel geschrieben ist, müßte ich dir jetzt deutlich unter die Nase reiben, daß die Sprache „Python“ und nicht „Phyton“ heißt. So intensiv kann deine Auseinandersetzung also nicht gewesen sein. Python ist auch keine neue Hypesprache. Python ist relativ alt. Das ist kein Qualitätsmaßstab, zeigt aber ebenfalls, wie wenig du dich mit der Thematik auseinander gesetzt hast. Ich glaube ich war 2003 zum ersten mal auf der Europython.

    Ich sparen mir jetzt lange Ausführungen dazu, daß Python schon viele Jahre eine sehr stabile, verteilte OO Datenbank hat, deren Stabilität das neue NoSQL Zeugs (Hype? ;-)) ermstal erreichen muß. Du wirst auch in der .Net Welt nichts finden, was NumPy im akademischen Bereich nur Ansatzweise das Wasser reichen kann. Die Liste läßt sich ziemlich lange fortsetzen. Ganz nebenbei kann man mit IronPython auf der .Net Plattform sehr spannende Sachen machen. Solltest du dich ernsthaft mit der Thematik auseinandersetzen wollen, stehe ich für weitere Diskussionen gerne zur Verfügung. 😉

    Grüße,
    Achim

    1. Hallo Achim,

      dass man an einem Abend nicht den kompletten Durchblick bekommt kannst du keinem vorwerfen aber das ist ja nicht das Thema.

      Im Großen und ganzen gebe ich Hans-Peter Recht, für mich ist entscheidend das ich Python lesen und verstehen kann. „Spannende Sachen“ kann man mit jeder beliebigen Programmiersprache machen solang man die Idee dazu hat.
      Mir persönlich fällt nichts auf was Python einzigartig macht. Nimm ein wenig OO und ein wenig Funktionale Programmiersprache und du hast Python.
      Python hat bestimmt seine Daseinsberechtigung aber ich sehe momentan noch nicht den Vorteil, vielleicht kannst du uns den ja näher bringen.

      Grüße
      Silvio

      1. Hallo Silvio,

        Vorteile sieht man nur, wenn man bereit ist, ander Lösungen als die bekannten in Erwägung zu ziehen. Wenn du mal einen Blick über http://www.python.org/about/quotes/ schweifen läßt, sollte das zumindest zum Denken anregen. Ich persönlich habe basierend auf einer Pythonstandardinstallation Algorithmen implementiert, deren Performance mit C# und auch C++ nicht annähern zu erreichen war (theoretisch natürlich schon, aber nicht in der Praxis ;-)). Von daher finde ich diese Seitehiebe auf interpretierte Sprachen lächerlich. Das sind Argumente aus lang vergangenen Zeiten.

        Falls du wirklich mal nach „Vorteilen“ schauen willst: List comprehension, duck typing, meta classes, …

        Grüße,
        Achim

    2. Hallo Achim,
      vielen Dank für deinen Beitrag, auch wenn ich nicht weiß warum du von unsachlich sprichst, mit Ausnahme meines Rechtschreibfehlers (danke für die Richtigstellung), habe ich lediglich meine persönliche „.NET Entwickler“ Meinung über eine in letzter Zeit (das nenne ich Hype) stärker in der Fordergrund tretende Sprache geäußert.
      Übrigens finde ich dass eine Sprache, die erst Mitte des letzten Jahrzent richtig von sich reden machte, eine Junge Sprache ist.
      Wenn Morgen ein Eiffel Hype beginnen sollte, dann würde ich auch von neuer Sprache reden obwohl die Ursprünge dieser Sprache bereits 1985 gelegt wurden.
      Aber so hat nun mal jeder sein Meinung und, das ist auch gut so.
      Beste Grüße
      Hans-Peter

      1. Hallo Hans-Peter,

        das „unsachlich“ kommt daher, daß du deine Meinung mit angeblichen Fakten vermischst. Natürlich darf jeder seine Meinung haben und das ist in der Tat gut so. Daß Python erst seit „Mitte des letzten Jahrzents“ von sich reden macht und erst „in letzter Zeit“ „stärker in der Fordergrund“ tritt, sind keine Fakten, sondern deine subjektive Eindrücke. Das wollte ich richtig stellen. Natürlich steht es dir frei, Python nicht zu mögen. Ich mag auch kein Java, begründe das aber in der Regel besser. 😉

        viele Grüße,
        Achim

        1. Hallo Achim,
          ich habe überhaupt nicht gesagt, dass ich Python nicht mag (dafür habe ich doch noch viel zu wenig über Python erfahren), ich frage mich doch nur, was so viel besser an Python ist als an den anderen Sprachen und was es mir als .NET Entwickler bringen kann.

          Über die „Unsachlichkeit“ meines Artikel ist werde ich an dieser Stelle besser nicht weiter diskutieren.
          Da kann sich jeder sein eigenes Urteil darüber bilden.
          Beste Grüße
          HP

          1. Zur beruhigung. Ich habe auch noch nicht gemerkt was besser sein soll an Python als an C#. Vielleicht kann ich es dir in einem Jahr sagen.

  2. Lieber Hans-Peter,

    Na sooo hip und hype ist python ja nun auch nicht – immerhin hat es 20 Jahre (1991) auf dem Buckel und ist damit 4 Jahre aelter als Java und ganze 10 Jahre aelter als C# 1.

    Klammern dienen in C bis C# lediglich der Verdeutlichung, Abgrenzung von Bloecken und damit Eingrenzung von Scope.

    Das kannst du vergleichen mit

    2 / 3 * 4

    Was soll hier zuerst passieren? Die divison? Oder die Multiplikation?

    Hier ist es ein Unterschied ob du (2/3) * 4 oder 2 / (3*4) rechnest. Derartige Disambiguitaeten solltest du nach der Python-Denke vermeiden. Du kannst halt nicht beliebig viele Aussagen/ Ausdruecke und Anweisungen in eine Zeile packen, aber dadurch faellt die Notwendigkeit, innerhalb einer Zeile Eindeutigkeit mittels Klammern zu schaffen einfach weg.

    Zum Scope:
    Die Frage ist dabei, wieso man das ende immer explizit festlegen muss. Du hast sicher schon mehr als einmal eine Klasse gefunden die auf

    } // If
    } // Catch
    } // Methode
    } // Klasse
    } // Namespace

    endet!

    Hier findet man auch oft

    }}}}}

    Wenn wer faul ist.

    Die Abgrenzung zur unteren Seite ist eigentlich unnoetig, da man nach gutem Stil in C# ja auch einruecken soll. Durch Python erspart man sich sehr viel syntaktisches Rauschen ohne diese Klammerung.

    Auch sehr schoen finde ich dabei das Beispiel mit der For-Schleife,
    for i in range(10): print i

    vs.

    for(int i = 0; i < 10; i++) { Console.WriteLine(i);}

    Mal abgesehen von der statischen Typisierung (die meist auch stark ueberbewertet wird) habe ich hier viel zu viel Syntaktisches Rauschen durch ; { } und ()
    Da braucht man fuer die Python version wesentlich weniger Schreibaufwand.

    Wieso soll ich denn die Erstellung von einer Sequenz bis 10 so detailiert beschreiben? Range 10 gibt mir einfach ein iterierbares objekt dass for dann abarbeitet. Mit der Standard Forschleife habe ich viel zu viel Detailarbeit zu leisten.

    Wuerde aber in C# genuso funktionieren wenn du

    class Range : IEnumareble { /*…*/}
    foreach(new Range(0)) {

    }

    nehmen wuerdest.

    Die C Familie rauscht einfach sehr stark, und schwaecht dadurch das Signal ab, dass man eigentlich senden will, wenn man durch Code kommuniziert.

    Python eignet sich sehr gut fuer die Programmierung von Webapplikationen, Webservern, Windowsprogrammen und sogar Diensten.

    Nimm dir dich mal Mercurial oder PyMol, die sind in Python geschrieben. Besonders Mercurial ist sehr maechtig, dabei auch TortoiseHG, das Pendant zu TortoiseSVN, also die klickbare Windows Shell fuer Mercurial. Die steht der von TortoiseSVN in nichts nach, im Gegenteil, ist schneller, besser und genauso in den Explorer integriert. Die UI Metaphern sind die selben wie bei jeder normalen Vanilla-Windows Applikation. Klar, ist ein wenig angestaubter als das gute XAML, aber an sich nicht verkehrt und ausserdem noch portierbar.

    TortoiseHG kommt mit einem eingebauten Webserver (alles Python), der aus jedem Ordner raus erlaubt per HTTP das Repository zu teilen. Schnell und elegant nenn ich das.

    Django, ein Webframework fuer Python steht ASP.NET MVC in keiner Weise nach.

    Fuer WebServices an sich gibt es meiner Meinung nach keine schoenere Loesung als Sinatra. Das ist zwar in Ruby geschrieben, aber das ist syntaktisch ein naher verwandter von Python.

    In Sinatra reicht folgendes um eine Webseite zu Zaubern:

    require ’sinatra‘

    get „/“ do
    „Hello, World!“
    end

    Das gleiche in C# WCF sieht ungefaehr so aus:

    [ServiceContract]
    public interface ISayHello
    {
    [OperationContract]
    [WebInvoke(UriTemplate = „/“, Method = „GET“)]
    String HelloWorld();
    }
    public class Hello : ISayHello {
    String HelloWorld() { return „Hello, World“; }
    }

    Selbst in MVC wirst du nicht mit so wenig Code auskommen. Und weniger Code bedeutet mehr klarer Ausdruck!

    Guck dir doch mal IronPython an, das ist Python auf die CLR in IL kompiliert. Damit kannst du alle System Namespaces nutzen, etc, wobei durch die Kompilierung das ganze aber langsamer wird als wenn man direkt ein wenig auf der interaktiven Pythonshell scriptet.

    Mir als .NET Fan kommt diese OpenSourcePythonRubyJavaScript seltsam vor aber ich moechte offen dafuer sein. Daher finde ich es gut wenn mehr Leute da reinschnuppern und man nicht so alleine ist und viele Kollegen mitmachen!

    Lieben Gruss

    Johannes

    1. Hallo Johannes,
      vielen lieben Dank für diesen tollen Kommentar.

      Wie könnte ich nach diesen vielen kleinen Leckerchen die du hier hingeworfen hast, deinem Aufruf nicht folgen und doch noch tiefer in das OpenSourcePythonRubyJavaScript Thema eintauchen.

      Beste Grüße
      Hans-Peter

  3. Hallo,

    nun, hier muss ich auch meinen Senf dazu geben :) Ich haette das vermutlich schon frueher getan, aber leider war ich heute den ganzen Tag unterwegs.

    Als Letzter in der Kette fuehle ich mich jetzt in meiner Aussagekraft ein wenig eingeschraenkt, werde aber trotzdem versuchen meine Punkte klar rueberzubekommen.

    Zuersteinmal ist das Vergleichen von Programmiersprachen ein Problem an sich.

    Es bedarf an sich ein langes Studium der einzelnen konzeptionellen Ideen, die den Sprachen zugrunde liegen, um einen objektiven Vergleich herzufuehren. D.h. fuer einen Entwickler, der sich noch keine grosse Gedanken im Bereich Kompilerbau, Grammatik und Semantik, etc. gemacht hat (und das sind vermutlich die meisten), spielen im Wesentlichen die in den oberen Posts angedeuteten Features eine Rolle.

    Pragmatisch gesehen sind dies die Moeglichkeiten, die eine Programmiersprache anbietet, um ein Projekt erfolgreich durchzufuehren.

    Zusaetzlich zu den Punkten „Verfuegbare Bibliotheken, Open Source, Typsystem, Laufzeitumgebung und Syntax“ sollte man hier auch noch die individuelle Erfahrung mit der Sprache und den verfuegbaren Tool-Support betrachten.

    Diese zwei Punkte sind aus meiner Erfahrung heraus wesentlich und arten in den bekannten Religionsdiskussionen aus, die meistens vollkommen sinnlos sind, da in allen Mainstream-Programmiersprachen nahezu equivalente Loesungsansaetze existieren.

    Das ist dann wie Salami mit Leberwurst zu vergleichen. Geschmackssache.

    Und, ja, auch Python ist schon lange kein Hype mehr :).

    D.h. es wird immer einen Entwickler geben, der fuer ein gegebenes Problem in der jeweils anderen Sprache eine aehnlich effiziente und elegante Loesung kennt.

    Natuerlich gibt es bei den Programmiersprachen wirklich wesentliche Unterschiede, die betreffen aber meistens nicht den Durchschnittsprogrammierer. Hier ein paar, die mir spontan einfallen:

    – Funktionale Sprachen erfordern vom Entwickler ein komplettes Umdenken in der Art wie man Probleme angeht und ermoeglichen durch ihre komprimierte Ausdrucksfaehigkeit verstaendlichere Abstraktion in der Anwendung von bestimmten Algorithmen, insbesondere beim Verarbeiten von Datenstroemen oder Graphen..

    – Dynamisch typisierte Sprachen tun sich mit dem Refactoring schwer.

    – Sprachen, die nativ Aktoren, Software Transactional Memory, Channels als Alternative zu den bekannten Synchronisationsprimitiven bereitstellen, sind besser zur Abstraktion parallel ablaufender Vorgaenge geeignet.

    Aber jetzt zu den einzelnen Argumentationspunkten:

    Hans-Peter,

    ein vernuenftiges Programm mit Python zu entwickeln ist fuer Windows durchaus moeglich. Z.B. ist der Dropbox Client in Python entwickelt.

    Deine Verstaendlichkeitsdefizite mit Python fuehre ich rein auf Deine kognitive Gewoehnung an { } Syntax basierten Programmiersprachen zurueck.

    Die Sprache C# ist durch die Mono Implementierung (BSD Lizenz) und der von Microsoft veraeusserten „Community Promise“ quasi Open Source. Das Mono Team hat z.B. in den letzten Tagen die C#5 Async Mechanismen noch vor Microsoft komplettiert.

    Achim,

    Hans-Peters Artikel mag ein wenig unsachlich sein, aber emotional kann man die Argumentation von Hans-Peter durchaus nachvollziehen.

    Ich will eigentlich nicht den Elefanten im Raum erwaehnen, aber fuer jeden von uns entsteht durch die Flut an Neuigkeiten (neue Sprachen und Technologien) jeden Tag wieder erneut die Angst, dass unser muehsam erarbeitetes Wissen morgen nicht mehr benoetigt wird. Dieses Empfinden ist fuer jeden von uns ganz natuerlich, schwer abschaltbar und fuehrt oft dazu dass die fremde Technologien erstmal abgeleht werden.

    Das „NoSQL Zeugs“ ist nie ein Hype gewesen. Fast die komplette Google Technik basiert auf den Grundprinzipien.

    List Comprehension:

    Ist syntaktischer „Zucker“ und kann mit LINQ und Tuples – wenn auch ein wenig ausschweiffender – formuliert werden. Wobei man Zweifel haben kann ob List Comprehensions fuer Entwickler ohne mathematische Fokussierung interessant sind.

    Duck Typing: (oder Structural Subtyping) ist ueber Reflections oder auch dynamische Code-Generierung sehr effizient implementierbar. Es gibt in .NET mehrere Bibliotheken dafuer.

    Meta Classes: Das ist relativ schwer fuer eine statisch typisierte Sprache, aber vieles was mit Metaklassen „gehackt werden kann“, kann man unter .NET auch mit Postsharp oder dynamischen Interface Proxies nachbauen. Aus meiner Erfahrung heraus muss ich aber leider auch darauf hinweisen, dass das Veraenderung von „erwarteter Funktionalitaet“ immer ein wenig gefaehrlich ist und somit Meta Klassen nur fuer extreme Faelle zur Vermeidung von Code-Duplizierung verwendet werden sollten.

    Johannes:

    Insgesamt stimme ich mit Deinen Argumenten ueberein, bin aber wie schon erwaehnt nicht der Meinung das sie wesentlich sind. Ob man sensitiv auf Einrueckungen oder {} Klammern ist, macht meiner Meinung nach keinen Unterschied und dass man in C# die Klasse einer statischen Funktion explizit angeben muss kann genauso als Elimierung einer „Disambiguitaet“ interpretiert werden.

    btw: Range ist in .NET integriert:
    foreach (var i in Enumerable.Range(0,10)) Console.WriteLine(i);

    „Rauschen“ wird meiner Meinung nach hauptsaehlich durch das Anwenden einer unpassenden Abstraktionsebene oder Sprachfeature erzeugt, und nicht durch Syntax. Selbst bei Pascal habe ich „begin“ und „end“ nie als Rauschen gesehen. Ein paar Tage Eingewoehnung, und das Gehirn verknueft die Schluesselwoerter einfach mit den Neuronen, die vorher { und } repraesentiert hatten.

    Ausserdem sehe ich aber nach wie vor fuer groessere Projekte einen Vorteil in der Verwendung von statisch typisierten Programmiersprachen, da ich persoenlich ein verlaessliches Refactoring als essentiell empfinde und auch nicht daran glaube dass sich TDD soweit durchsetzt, dass man damit grosse Projekte in Teams mit durchschnittlichem Entwickler IQ bauen kann (ja, LISPler duerfen sich mal wieder geehrt fuehlen).

    Gegenbeispiele gibt es zwar auch, (z.B. Thoughtworks mit Ruby), aber hier nur mit vielen, vielen Testcases und ganz bestimmt ueberdurchschnittliches Entwicklerpotential.

    Sinatra Portierungen gibt es fuer .NET zuhauf (z.B Nancy). Die Syntax ist nicht aufwendiger:

    Get[„/greet/{name}“] = x =>
    {
    return „Hello “ + x.name;
    }

    WCF als .NET Beispiel aufzufuehren war unfair.

    http://en.wikipedia.org/wiki/Parkinson%27s_Law_of_Triviality

    lg armin

  4. Wo Licht ist, ist auch Schatten. Nicht das wie, sondern das drum herum ist es. Nicht das so, sonders das anders. Python ist nicht besser oder schlechter als. Im richtigen Kontext ist es gut.

    Von der Technologischen Sicht empfinde ich F# oder C# viel cooler. Ich finde sie besser, weil ich ein Mensch bin, der gerne Sicherheit hat. Dafür musst du bei Python mehr Aufwand betreiben. Viel mehr. Das Tooling ist nicht das beste. Den besten Job macht hier denke ich im Moment einer der Neueren (Jetbrains mit PyCharm). Zu dem Teil mit den Frameworks und Tools sind wir ja noch nicht gekommen, weil ich so ausschweiffend war.

    Schau dir in .NET WPF an. Das strotzt nur so vor Dynamischem Code. JavaScript ist jetzt auch nicht unbedingt der Vertreter von statischem Code 😉 CoffeScript ist da schon sehr viel angenehmer.

    Ich als Software Ingenieur habe gelernt mit dem Tool umzugehen, das am besten in mein Umfeld passt. Und wenn da alle Python reden … soll es so sein. Das heißt aber nicht, das ich nicht ständig Versuche alle vom Gegenteil zu überzeugen 😉

    Zum Schluss zählt ein zufriedener Kunde oder Arbeitgeber. Der will nicht hören, das er Jahre lang in eine „falsche“ Technologie investiert hat (wobei ich das bei Python nicht behaupten würde). Nach meinem aktuellen Wissensstand würde ich Flussorientiert entwickeln. Das geht mit F# gut. Mit C# ist es schon etwas aufwendiger. Mit Python geht es erstaunlich gut. Mit Anderen Programmiersprachen wie Clojure gehts bestimmt auch gut (auch dynamisch, wie eben ein LISP Dialekt).

    Die größte Stärke von Python liegt wohl auch in der Community. Alles ist OpenSource… gewaltig, was da alles zu finden ist.

    Mir ging es im Vortrag gar nicht um Hype, sondern einfach nur darum ein Werkzeug vorzustellen. Ein Werkzeug, das helfen kann Dinge anders zu betrachten. Nachdem ich F# nicht mehr sehen kann werde ich mich wohl mal an Clojure, Haskell oder Perl6 setzen. Wobei mich Haskell schon fast hindert. Gibts ja keine .NET Implementierung 😉

    Aber vielleicht schau ich mir auch noch so alte und banale Sprachen wie PHP an, die es mit Phalanger auch in .NET gibt. Hauptsache ein gutes Framework. Für mich ist Python eine Bereicherung, kein Konkurrent des Entweder oder. WPF mit IronPython ist übrigens auch sehr interessant …

    Wie auch immer … gut ist eben subjektiv. Geschmack bleibt polarisierend. Und das ist auch gut. Ich habe momentan den meisten Spaß mit C# (wegen dynamic und LINQ – flussorientierung, Funktionale Programmierung) und F#

    Happy Coding

  5. Hallo Allerseits, ich bin zwar einige Monaten spät, aber ich habe folgende Frage, hat jemand von euch mit großen Listen unter Python und C# gearbeitet z.B. 20.000.000 Objects/Items? Unter C# kann ich in Sekunden eine Liste mit 10 Mill Objekten, die dazu noch durch Nutzung von Factory-Pattern aus Strings in Integer, Double, DateTime konvertiert werden und ca 1GByte an Memory benotigt. Aber bei Python stoße ich bei diesen Großenordnung an die Grenzen: Speicherverbrauch über 3GByte und die Initialisierung/Befühlung der Liste dauert Minuten. Kann das jemand bestätigen bzw. widerlegen?

    P.S.: Die Daten lese ich aus einer CSV aus mit 2 Saplten jeweil 10.000.000 Einträge

    1. Hallo Sanya,

      deine Beobachtungen sind nicht überraschend, wenn du dir die Struktur der Sprachen anschaust. Python ist eine dynamische Sprache und speichert pro Objekt zusätzliche Metadaten, weshalb du mehr Speicher verbrauchst. Die 3GB Grenze ließe sich natürlich mit 64bit Python umgehen, falls das dein einziges Problem wäre. Ansonsten lohnt sich evtl. ein Blick auf numpy, ctypes, struct, … oder ähnliche Module, wenn du große Datenmengen mit einheitlicher Structur verarbeiten willst. Vielleicht macht sogar sqlite Sinn? Wenn du genauer beschreibst was du vor hast, kann ich dir eher sagen, wie ich dein Problem in Python lösen würde.

      Grüße,
      Achim

    2. Oder einfach nicht alles aufs mal laden. In Python heisst es so schön „Stromlinienförmig“. Nur das Einlesen was gerade gebraucht wird.
      Etwa so:
      with open(‚exemple.txt‘, ‚r‘) as f:
      for line in f:
      ….

      Habe das in einem schlauen Python Buch nachgeschlagen. :-) Hilft dir vielleicht.

  6. Hallo Allerseits, danke für eure Antworten. Die Sache ist foldende, ich arbeite als HiWi in einer Firma, die Software für Data-Pre-Processing schreibt, und da wird es mit Datenmengen in dieser Größenordnung gearbeitet. Nun gibt es Kunden, welche ihre Messdaten nicht in Datenbanken, sondern in CSV, Excel ect. persistent ablegen. Es hat sich eine Diskussion entbrannt, welche Sprache eignent sich am besten, um diese Datenmengen z.B. schnell in ein Datenmodell zu deserialisieren und darauf verschiedene approxiomatische Berechnungen durchzuführen. Wie bei Diskussionen so ist, gibt es mehrere Fronten, in meinem Fall nur zwei: Einer hat bis jetzt nur mit Python gearbeitet, kennt keine anderen Programmiersprachen, und behauptet, für Python wäre das kein Problem; ich für mein Teil bin für C#, da ich beides getestet habe und zu diesen Ergebnissen gekommen bin (s. Kom. oben).
    Ich habe diese Fragen hier gestellt, da ich selbst Python nur oberflächlich kenne und ich dachte, eventuell habe ich für diese Aufgabe in Python ein falsches Datentyp gewählt (Liste). Ich hab‘ z.B. gelesen, dass deque sich schneller mit Daten befüllen lassen sollen, leider kann ich das ebenfals nicht bestätigen.

    Es muss ein Datentyp sein, der sich schnell mit Daten befüllen läst und Indices hat. Es darf kein Set sein, da gleiche Werten ebenfalls mehrfach vorkommen sollen. Ein Dictionary für diese Aufgabe wollte ich nicht nehmen, da die keys, im meinem Fall Integer in aufsteigender Reihenfolge (0…n), explizit generiert werden müssen. Alles in eine Datenbank zu importieren, wollen die auch nicht, da im Arbeitsspeicher sich die Daten schneller auswerten lassen. Arbeitsspeicher stellt eigentlich hier kein Flaschenhals, da im Überflüss vorhanden. Was mich stört, warum dauert die Initialisierung der Objekte und das Befüllen der Liste so lange (im Vergleich zu C#).

    Also, wenn ich die Kommentare richtig deute, ist Python für diese Aufgabe nicht die richtige Wahl, oder?

    Die Vorschläge von Achim bzgl. „numpy“, „ctypes“, „struct…“ werde ich mir ebenfalls anschauen. Danke.

Schreib einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *