2009-12-15 22 views
10

mi pregunta simplemente se relaciona con la diferencia de rendimiento entre un socket en C y en Python. Dado que mi versión de Python es CPython, supongo que es similar, pero tengo curiosidad por saber si alguien tiene puntos de referencia "reales", o al menos una opinión basada en la evidencia.C/Python Socket Performance?

Mi lógica es como tal:

  • socket C mucho más rápido? luego, escriba una extensión C .
  • not/arely a difference? seguir escribiendo en Python y averiguar cómo obtener control de nivel de paquete (scapy? Dpkt?)

Estoy seguro de que alguien va a querer saber, ya sea para el contexto o la curiosidad. Planeo construir un tipo de proxy para mí (no para la navegación por Internet, el anonimato, etc.) y vincularé la aplicación que quiero usar con un puerto específico. Luego, todos los paquetes en dicho puerto se pondrán en cola, se modificará el encabezado de dirección, y luego se enviará, etc.

Gracias de antemano.

Respuesta

12

En general, enchufes en Python funcionan bien. Por ejemplo, la implementación de referencia del servidor de seguimiento BitTorrent está escrita en Python.

Al realizar operaciones de red, la velocidad de la red suele ser el factor limitante. Es decir, cualquier pequeña diferencia posible en la velocidad entre C y el código del socket de Python queda completamente eclipsada por el hecho de que está haciendo networking de algún tipo.

Sin embargo, su descripción de lo que quiere hacer indica que desea inspeccionar y modificar los paquetes individuales de IP . Esto está más allá de las capacidades de las bibliotecas de red estándar de Python, y en cualquier caso es una operación muy dependiente del sistema operativo. En lugar de preguntar "¿qué es más rápido?" primero deberá preguntar "¿es esto posible?"

+0

Gracias Greg. Tienes especial razón sobre "¿es esto posible?" No lo creo. dpkt permite la capacidad de construir paquetes, pero estoy seguro de que no puedo usar el socket de python en un nivel de paquete (en contra de su propósito de abstracción). Por lo tanto, creo que tendré que escribir una extensión C para poder usar la biblioteca netfilter que me permita hacerlo. Pero ... esto podría requerir que haga los enchufes en C (no sé, nunca he hecho una extensión C antes). – Kevin

+1

@Kevin, ¿por qué estás seguro de que no puedes hacer eso? ¿El soporte de socket "en bruto" no es adecuado? (Consulte el último ejemplo al final de http://docs.python.org/library/socket.html para empezar). –

1

creo que C sería más rápido, pero Python sería mucho más fácil de administrar y usar.

la diferencia sería tan pequeña, no se necesitaría menos que estaban intentando enviar masas cantidad de datos (algo estúpido como 1 millón de GB/segundo lol)

Joe

+0

Estúpido? ¿Qué sabrías? No hay votos a favor que veo. –

+0

Si la velocidad de la red es el factor limitante, la elección de los lenguajes de programación será mucho menos relevante. –