Cython i.V.m. Pandas, Scipy und Numpy installieren

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
consuli
User
Beiträge: 52
Registriert: Sonntag 26. Juli 2015, 22:10

Hallo!

Bei Pandas, Scipy und Numpy wurde mir die Anaconda Distribution empfohlen, weil es bei manueller Installation anscheinend oft zu Versionsverwechslungen kommt (siehe http://www.python-forum.de/viewtopic.php?f=2&t=36741 )

Gibt es für Cython irgendwelche Installationserleichterungen für Bibliotheken?

Consuli
Who controls the British crown? Who keeps the metric system down? We do! We do!
Who leaves Atlantis off the maps? Who keeps the Marsians under wraps? We do! We do!
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

a fool with a tool is still a fool, www.magben.de, YouTube
consuli
User
Beiträge: 52
Registriert: Sonntag 26. Juli 2015, 22:10

Dass heisst, ich kann die Pakete Pandas, Scipy und Numpy unter Cython genauso nutzen wie unter Python? Sind die komplexen Datentypen von Pandas, Scipy und Numpy (Series, array und DataFrame) denn statische oder dynamische Datentypen? Nach dem Buch Cython - A Guide for Python Programmers (Kurt W. Smith) lassen sich nur statische Datentypen mit Cython compilieren.

Consuli
Who controls the British crown? Who keeps the metric system down? We do! We do!
Who leaves Atlantis off the maps? Who keeps the Marsians under wraps? We do! We do!
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Wenn Du Anaconda benutzt, dann bedeutet das erstmal nur, dass Du die 300 Pakete nicht einzeln installieren musst, es bedeutet nicht, das jede Kombination aus diesen 300 Paketen zusammen funktioniert.

Cython wird üblicherweise aus zwei Gründen genutzt:
  1. um Python Programme zu beschleunigen
  2. um C oder C++ Code in Python einzubinden
Zu 1.)
Die Beschleunigung kommt daher, dass der Python Code in extrem hässlichen C-Code umgewandelt wird und dann wird dieser kompiliert. Kompilierter C-Code ist in der Regel schneller als Python Code. Eine andere Möglichkeit mathematische Python Programme zu beschleunigen ist die Verwendung von Numpy u. Co (dazu gehört auch Pandas). Auch hier beruht die Beschleunigung darauf, dass der ganze rechenintensive Code innerhalb von Numpy in kompiliertem C-Code ausgeführt wird. D.h. Cython wird gut geschriebenen Numpy-Code nicht wesentlich beschleunigen.

zu 2.)
Da empfehle ich stattdessen swig zu nehmen.

Grundsätzlich ist Cython ein Tool, das ich nur selten empfehlen würde und wenn dann nur erfahrenen Entwicklern. Versuche lieber erstmal das Performance-Potential von Numpy und Pandas auszuschöpfen.
a fool with a tool is still a fool, www.magben.de, YouTube
BlackJack

@consuli: Wenn's um Geschwindigkeit geht würde ich empfehlen erst einmal zu *messen* wo denn überhaupt der Flaschenhals liegt. Am Ende betreibst Du viel Aufwand um den Python-Anteil zu kompilieren, und dann stellt sich heraus das der nur 1% der Gesamtlaufzeit ausmacht. Vielleicht hast Du auch einfach einen sehr ungünstigen Algorithmus oder falsche Vorstellungen über das Laufzeitverhalten von ausgwähltem Python-Code und Du findest durch das messen Stellen die man durch umschreiben effizienter hinbekommt.
consuli
User
Beiträge: 52
Registriert: Sonntag 26. Juli 2015, 22:10

Vielleicht habe ich die Frage nicht gut gestellt.

Compiliert ein Cython Code, der Series, array und DataFrame Datentypen aus Pandas, Scipy und Numpy enthält, oder compiliert er nicht?

M.E. kann ein solcher Cython Code nicht compilieren, denn Series, array und DataFrame sind dynamische Datentypen; Cython benötigt nach der Quelle aber statische Datentypen um compilieren zu können.

Consuli
Who controls the British crown? Who keeps the metric system down? We do! We do!
Who leaves Atlantis off the maps? Who keeps the Marsians under wraps? We do! We do!
BlackJack

@consuli: Cython kompiliert grundsätzlich erst einmal so ziemlich jeden Python-Code. Da Python ausschliesslich „dynamische Typen” enthält, kompiliert auch Code der Numpy-Datentypen und ähnliches enthält. Davon Python-Code einfach nur mit Cython zu kompilieren sollte man sich nur keine grossen Geschwindigkeitsgewinne erhoffen. Ich glaube so zwischen 5—10% maximal — man spart sich halt grundsätzlich die Interpretation des Bytecodes, also den Schritt Bytecode→API-Aufruf, stattdessen stehen die API-Aufrufe direkt im generierten C-Code. Wirklich schnelleren Code bekommt man erst wenn man Typannotationen einsetzt, damit der C-Code nicht so generisch bleibt. Für Numpy-Typen, oder auch allgemeiner: Typen welche die Buffer-API unterstützen, gibt es bei Cython Annotationen. Und es gibt in der Cython-Dokumentation auch Beispiele.
Antworten