2009-06-02 3 views
2

Ich benutze Python für fast alles und war mir immer klar, dass ich aus irgendeinem Grund einen Engpass in meinem Python-Code finden könnte (aufgrund der Einschränkungen von Python), könnte ich immer ein C-Skript verwenden, das in meinen Code integriert ist .Ist es sinnvoll python mit c für die Performance zu integrieren?

Aber wie ich begann zu lesen guide auf, wie man Python zu integrieren. In dem Artikel der Autor sagt:

Es gibt mehrere Gründe, warum man sich wünschen kann Python in C oder C++, wie zu erweitern:

  • Aufruf von Funktionen in einer vorhandenen Bibliothek.
  • einen neuen builtin Typ Python
  • Optimierung der inneren Schleifen in Code
  • Belichten eines C++ Klassenbibliothek zu Python
  • Embedding Python in einer C/C++ Anwendung

nichts über die Leistung Hinzufügen . Also frage ich nochmal, ist es sinnvoll Python mit c für Performance zu integrieren?

+8

Wie ist "Optimierung der inneren Schleifen" "nichts über die Leistung"? -) –

+3

Wenn "Optimierung der inneren Schleifen im Code" nicht über Leistung, was bedeutet es, bedeutet es? –

Antwort

9

Meiner Erfahrung nach ist es selten notwendig, mit C zu optimieren. Ich bevorzuge es, in Python Engpässe zu identifizieren und Algorithmen in diesen Bereichen zu verbessern. Die Verwendung von Hashtabellen, das Caching und die generelle Neuorganisation Ihrer Datenstrukturen für künftige Anforderungen bietet ein erstaunliches Potenzial für die Beschleunigung Ihres Programms. Wenn sich Ihr Programm entwickelt, werden Sie besser einschätzen können, welche Art von Material vorberechnet werden kann, also haben Sie keine Angst davor, Ihren Speicher und Ihre Algorithmen wiederherzustellen. Suchen Sie außerdem nach Möglichkeiten, "zwei Fliegen mit einer Klappe" zu töten, z. B. wenn Sie Objekte sortieren, während Sie sie rendern, anstatt große Arten zu machen.

Wenn alles nach bestem Wissen bearbeitet wird, würde ich einen Optimierer wie Psyco in Betracht ziehen. Ich habe buchstäblich 10-fache Leistungsverbesserungen erlebt, nur indem ich Psyco benutzt und eine Zeile zu meinem Programm hinzugefügt habe.

Wenn alles andere fehlschlägt, verwenden Sie C an den richtigen Stellen und Sie bekommen, was Sie wollen.

+1

psycho ist grundsätzlich veraltet und funktioniert nur auf x86. Ich weiß, dass es noch keinen Ersatz gibt (Entwickler arbeiten mit Pypy), aber ich habe seit Jahren keine x86-Maschinen mehr. – JimB

+0

Ich bin versucht zu sagen, dass für die meisten Fälle, wenn Sie Psyco verwenden, ist, weil Ihr Algorithmus nicht genug optimiert ist. Sicher, Psyco oder C ist schneller als Python; aber Sie müssen zuerst die Komplexität reduzieren. – NicDumZ

7

* Optimierung der inneren Schleifen im Code

Ist das nicht über die Leistung?

+0

Ja tut es, sorry, aber jetzt bin ich neugierig auf andere "Stapler" Meinungen ... – Diones

+0

Sicher, ich bin auch! Ich nahm nicht an, dass meine Antwort auch angenommen wurde:) –

6

Leistung ist ein weites Thema, deshalb sollten Sie genauer sein. Wenn der Engpass in Ihrem Programm viel Netzwerkarbeit erfordert, dann wird das Umschreiben in C/C++ wahrscheinlich keinen Unterschied machen, da die Netzwerkaufrufe Zeit brauchen, nicht Ihr Code. Sie wären besser dran, den langsamen Abschnitt Ihres Programms neu zu schreiben, um weniger Netzwerkanrufe zu verwenden und so die Zeit zu reduzieren, die Ihr Programm auf entwork IO wartet. Wenn Sie mathintensive Aufgaben wie das Lösen von Differentialgleichungen ausführen und wissen, dass es C-Bibliotheken gibt, die eine bessere Leistung bieten, dann sollten Sie den Abschnitt Ihres Programms so umschreiben, dass Sie diese Bibliothek verwenden, um die Leistung zu erhöhen Performance.

1

Sie erhalten einen großen Leistungsschub mit C aus Python (vorausgesetzt, Ihr Code ist gut geschrieben, usw.), weil Python zur Laufzeit interpretiert wird, während C vorher kompiliert wird. Das wird die Dinge ein wenig beschleunigen, denn mit C läuft Ihr Code einfach, während der Python-Interpreter bei Python herausfinden muss, was Sie tun, und ihn in Maschinenanweisungen interpretieren.

2

C kann definitiv prozessorgebundene Aufgaben beschleunigen. Die Integration ist jetzt noch einfacher, mit der ctypes-Bibliothek, oder Sie können sich für eine der anderen Methoden entscheiden, die Sie erwähnen.

Ich fühle mercurial hat einen guten Job mit der Integration gemacht, wenn Sie ihren Code als ein Beispiel betrachten möchten. Die rechenintensiven Aufgaben sind in C und alles andere ist Python.

+0

"Ich merke, dass mercurial mit der Integration einen guten Job gemacht hat, wenn Sie ihren Code als Beispiel betrachten wollen. Die rechenintensiven Aufgaben sind in C und alles andere ist Python." Wow danke für den Tipp werde ich mir das ansehen: D – Diones

0

Mir wurde gesagt, für den Berechnungsteil Verwendung C für die Skripterstellung Python verwenden. Also ja, du kannst beides integrieren. C ist in der Lage schneller zu berechnen als die von Python

3

Die C-Extensions-API ist notorisch schwer zu arbeiten, aber es gibt eine Reihe anderer Möglichkeiten, C-Code zu integrieren.

Für einige weitere brauchbare Alternativen siehe http://www.scipy.org/PerformancePython, insbesondere den Abschnitt über die Verwendung von Weave für die einfache Einfügung von C-Code.

Ebenfalls interessant ist Cython, die ein schönes System für die Integration mit C-Code bietet. Cython wird für die Optimierung von einigen hoch angesehenen Python-Projekten wie NumPy und Sage verwendet.

Wie oben erwähnt, ist Psyco eine weitere attraktive Option für die Optimierung und eine, die requires nichts anderes als

import psyco 
psyco.bind(myfunction) 

Psyco Ihre inneren Schleifen identifizieren und automatisch optimierte Versionen der Routinen ersetzen.

Verwandte Themen