Sie könnten versuchen Cython. Für mich ergibt dies:
function usec per loop:
Python Cython
array_ctypes 1370 1220
array_struct 384 249
array_numpy 336 339
So Numpy gibt nur 15% Vorteil auf meiner Hardware (alter Laptop mit Windows XP), während Cython etwa 35% ergibt (ohne zusätzliche Abhängigkeit in Ihrem verteilten Code).
Wenn Sie Ihre Anforderung lösen, dass jeder Punkt ein Tupel von Schwimmern ist, und einfach ‚Punkte‘ machen eine abgeflachte Float-Liste:
def array_struct_flat(points):
n = len(points)
return pack(
"f"*n,
*[
coord
for coord in points
]
)
points = [random() for _ in xrange(1000 * 2)]
dann die resultierende Ausgabe ist die gleiche, aber das Timing geht weiter nach unten:
function usec per loop:
Python Cython
array_struct_flat 157
Cython könnte auch, wenn jemand klüger als ich als dies wesentlich besser geeignet sein wollte Erklärungen statischen Typ, um den Code hinzuzufügen. (Das Ausführen von 'cython -a test.pyx' ist dafür von unschätzbarem Wert, es erzeugt eine HTML-Datei, die Ihnen anzeigt, wo das langsamste (gelbe) einfache Python in Ihrem Code ist, im Gegensatz zu Python, das in reines C (weiß) konvertiert wurde ich breitete den Code oben aus auf so viele Zeilen, weil die Färbung pro-line durchgeführt wird, so hilft es, sie um sich auszubreiten ähnlich)
Voll Cython Anweisungen sind hier:. http://docs.cython.org/src/quickstart/build.html
Cython könnte produzieren ähnliche Leistungsvorteile in Ihrer gesamten Codebasis, und unter idealen Bedingungen, bei richtiger statischer Typisierung, kann die Geschwindigkeit um Faktoren von zehn oder hundert verbessert werden.
Ich übersetzte diese Frage auch an die Newsgroup gmane.comp.python.opengl.user, die ähnliche Antworten wie unten lieferte. –