2009-09-30 13 views
5

Estoy buscando implementar un controlador de lógica difusa basado en bibliotecas PyFuzzy (Python) o FFLL (C++).¿El rendimiento de Python vale la pena el costo?

Preferiría trabajar con Python pero no estoy seguro si el rendimiento será aceptable en el entorno incrustado en que funcionará (ya sea ARM o embedded x86 proc ~ ~ 64Mbs de RAM).

La principal preocupación es que los tiempos de respuesta sean lo más rápidos posible (una velocidad de actualización de 5hz + sería ideal> se requieren 2Hz). El sistema leerá desde múltiples (probablemente 5) sensores desde un puerto RS232 y proporcionará 2/3 salidas basadas en los resultados de la evaluación difusa.

¿Debo preocuparme de que Python sea demasiado lento para esta tarea?

+5

Sugiero probar con un prototipo simple en su plataforma específica. –

+0

5 Hz no es exactamente el tiempo de respuesta rápido si necesita alguna interacción humana con el dispositivo. –

Respuesta

35

En general, no debe obsesionarse con el rendimiento hasta que realmente haya visto que se convierta en un problema. Como no conocemos los detalles de su aplicación, no podemos decir cómo funcionaría si se implementara en Python. Y como aún no lo ha implementado, tampoco puede hacerlo.

Implemente la versión que le resulte más cómoda y la más rápida. Luego haz una evaluación comparativa. Y si es demasiado lento, que tiene tres opciones que deben hacerse en orden:

  • En primer lugar, optimizar su código Python
  • Si eso no es suficiente, se el mayoría de las funciones de rendimiento crítico en C/C++, y llame a eso desde su código Python
  • Y, por último, si realmente necesita un rendimiento superior, es posible que tenga que volver a escribir todo en C++. Pero al menos tendrás un prototipo funcional en Python, y tendrás una idea mucho más clara de cómo debería implementarse. Sabrá qué dificultades debe evitar, y tendrá una implementación correcta para contrastar y comparar resultados.
+14

+1 La optimización prematura es la raíz de todo mal. –

+4

Es la raíz de todo mal, y está por encima del desbordamiento de la pila. – FogleBird

+1

De acuerdo con jalf en todos los puntos. Además, si gran parte del trabajo se realizará mediante llamadas a bibliotecas, no importa mucho si llama a la biblioteca desde C o desde Python. Si usa las funciones de lenguaje integradas de los módulos de biblioteca Python y C, quizás nunca note un golpe de rendimiento para Python; si intentas escribir tu propia FFT en Python nativo o algo así, verás un rendimiento horrible. Usa Python para escribir las partes de alto nivel y trata de dejar que las bibliotecas Python y C hagan el trabajo pesado. – steveha

11

Python es muy lento en el manejo de grandes cantidades de datos no de cadena. Para algunas operaciones, puede ver que es 1000 veces más lento que C/C++, así que sí, debe investigar esto y hacer los puntos de referencia necesarios antes de hacer algoritmos de tiempo crítico en Python.

Sin embargo, puede extender python con módulos en código C/C++, de modo que las cosas críticas para el tiempo sean rápidas, y al mismo tiempo pueda usar python para el código principal.

+4

+1 También me gustaría, como línea de base, intentar escribirlo en python y reemplazar partes lentas con C si es necesario. –

5

Haz que funcione, luego haz que funcione rápido.

+1

No olvide el paso intermedio, "Hacer que funcione correctamente". – JasCav

+0

Puse "hacerlo funcionar correctamente" en mi definición de hecho. Pero te escucho – KevDog

1

Si la mayor parte del tiempo de ejecución se utiliza en bibliotecas C, el idioma que utilice para llamar a estas bibliotecas no es importante. ¿En qué idioma están escritas tus bibliotecas devoradoras de tiempo?

0

Según su descripción, la velocidad no debería ser una gran preocupación (y puede usar C, cython, lo que quiera para hacerlo más rápido), pero la memoria sería. Para entornos con un máximo de 64 Mb (donde el sistema operativo y todos deberían caber también, ¿no?), Creo que hay una buena posibilidad de que python no sea la herramienta adecuada para la implementación del objetivo.

Si tiene una lógica no trivial para manejar, aún así crearía prototipos en python.

0

Nunca he medido realmente el rendimiento de los ejemplos de pyfuzzy, pero como la nueva versión 0.1.0 puede leer archivos FCL como lo hace FFLL. Simplemente describa su sistema difuso en este formato, escriba algunos envoltorios y compruebe el rendimiento de ambas variantes.

Para leer FCL con pyfuzzy necesita el tiempo de ejecución antlr python, pero después de leer, debe ser capaz de recuperar el objeto leído, por lo que no necesita la carga aérea antlr en el destino.