python c ctypes overhead

python - extensión ctypes vs c



overhead (2)

Tengo algunas funciones escritas en C para un proyecto de juego. Estas funciones se llaman bastante (alrededor de 2000-4000 veces por segundo). Las funciones están escritas en C para velocidad bruta.

Ahora, la forma más fácil para que yo incluya estas funciones en Python es usar ctypes . La alternativa es escribir una extensión C en Python alrededor de estas funciones (lo que requiere un esfuerzo adicional). Así que me pregunté, sin incluir la carga inicial de la DLL, ¿qué tan grande es la sobrecarga de ctypes ?

Estoy usando Python 2.7 (la versión estándar de CPython), y no quiero usar una biblioteca externa como Cython.

Sé que esta pregunta se ha hecho antes, pero no he visto mucha información sobre la comparación de rendimiento entre las dos opciones.


He comparado el rendimiento de una extensión C con un envoltorio ctypes. En mi prueba particular, la diferencia fue de aproximadamente 250x. Hubo varias llamadas a la biblioteca C, por lo que el contenedor ctypes también estaba ejecutando el código Python. El tiempo de ejecución de la biblioteca C fue muy corto, lo que hizo que la sobrecarga adicional para el código Python fuera aún más significativa. Por lo tanto, la proporción probablemente será diferente para usted, pero fue significativa en mi caso.


La interfaz codificada directamente en C tiene el potencial de ser mucho más rápida. El cuello de botella es la interfaz de Python a C, y la reorganización de argumentos y resultados puede implicar, por ejemplo, copiar cadenas o convertir listas de Python a / desde arreglos en C. Si tiene un bucle que realiza varios cientos de estas llamadas y algunos de los datos no tienen que ser ordenados por separado para cada llamada, entonces todo lo que tiene que hacer es recodificar el bucle en C y es posible que pueda reducir masivamente el cuello de botella. . ctypes no le da esa opción: todo lo que puede hacer es llamar directamente a las funciones existentes.

Por supuesto, todo depende exactamente de qué tipo de funciones está llamando y qué tipo de datos está transmitiendo. Es posible que no pueda reducir los gastos generales, en cuyo caso aún esperaría que los tipos de información fueran más lentos, pero quizás no significativamente.

Lo mejor sería reunir una muestra de su código escrito en cada dirección y compararla. De lo contrario, hay demasiadas variables para una respuesta definitiva.