Puede probar Cython. Para mí, esto da:
function usec per loop:
Python Cython
array_ctypes 1370 1220
array_struct 384 249
array_numpy 336 339
Así Numpy sólo da 15% de beneficios en mi hardware (viejo portátil Windows XP corriendo), mientras que Cython da alrededor del 35% (sin ningún tipo de dependencia adicional en su código distribuido).
Si puede aflojarse el requisito de que cada punto es una tupla de flotadores, y simplemente hacer 'puntos' una lista lineal de flotadores:
def array_struct_flat(points):
n = len(points)
return pack(
"f"*n,
*[
coord
for coord in points
]
)
points = [random() for _ in xrange(1000 * 2)]
entonces la salida resultante es el mismo, pero va el tiempo más abajo:
function usec per loop:
Python Cython
array_struct_flat 157
Cython podría ser capaz de sustancialmente mejor que esto también, si alguien más inteligente que yo quería añadir declaraciones de tipo estático del código. (Ejecutar 'cython -a test.pyx' es invaluable para esto, produce un archivo html que muestra dónde está el Python plano más lento (amarillo) en su código, frente a python que se ha convertido en C puro (blanco). Es por eso que extendí el código de arriba hacia fuera sobre tantas líneas, debido a que la coloración se realiza por línea, lo que ayuda a difundirlo a cabo por el estilo) instrucciones
completa Cython aquí:. http://docs.cython.org/src/quickstart/build.html
Cython podría producir prestaciones de rendimiento similares en toda la base de código, y en condiciones ideales, con la tipificación estática adecuada aplicada, puede mejorar la velocidad por factores de diez o cien.
Publiqué esta pregunta al grupo de noticias gmane.comp.python.opengl.user también, que arrojó respuestas similares a las siguientes. –