2009-12-15 17 views
10

Ma question concerne simplement la différence de performance entre une socket en C et en Python. Étant donné que mon build Python est CPython, je suppose que c'est similaire, mais je suis curieux de savoir si quelqu'un a réellement de "vrais" benchmarks, ou du moins une opinion basée sur des preuves.C/Python Socket Performance?

Mes logiques est en tant que tel:

  • socket C beaucoup plus rapide? puis écrivez une extension C .
  • pas/à peine une différence? continuer à écrire en Python et comprendre comment obtenir le contrôle de niveau des paquets (scapy? Dpkt?)

Je suis sûr que quelqu'un voudra savoir soit pour le contexte ou la curiosité. J'ai l'intention de construire une sorte de proxy pour moi-même (pas pour la navigation sur Internet, l'anonymat, etc.) et lier l'application que je veux utiliser avec un port spécifique. Ensuite, tous les paquets sur le port seront mis en attente, l'en-tête d'adresse sera modifié, puis envoyé, etc.

Merci d'avance.

Répondre

12

En général, Les sockets en Python fonctionnent très bien. Par exemple, l'implémentation de référence du serveur de suivi BitTorrent est écrite en Python.

Lors des opérations de mise en réseau, la vitesse du réseau est généralement le facteur limitant. En d'autres termes, toute différence minime de vitesse entre C et le code de socket de Python est complètement occultée par le fait que vous faites en réseau d'une certaine sorte. Toutefois, votre description de ce que vous voulez faire indique que vous voulez inspecter et modifier les paquets IP individuels. Cela dépasse les capacités des bibliothèques réseau standard de Python, et est dans tous les cas une opération très dépendante du système d'exploitation. Plutôt que de demander "qui est plus rapide?" vous devrez d'abord demander "est-ce possible?"

+0

Merci Greg. Vous avez particulièrement raison à propos de "est-ce possible?" Je ne le crois pas. dpkt permet de construire des paquets, mais je suis persuadé que je ne peux pas utiliser le socket python au niveau du paquet (par opposition à son but d'abstraction). Donc, je crois que je vais devoir écrire une extension C afin que je puisse utiliser la bibliothèque netfilter qui permettrait de le faire. Mais ... cela peut nécessiter que je fasse les sockets en C (je ne sais pas, je n'ai jamais fait d'extension C auparavant). – Kevin

+1

@Kevin, pourquoi es-tu sûr que tu ne peux pas faire ça? Le support de la prise "brute" ne convient-il pas? (Voir le dernier exemple à la fin de http://docs.python.org/library/socket.html pour les débutants.) –

1

Je pense que C serait plus rapide, mais python serait beaucoup plus facile à gérer et à utiliser.

la différence serait si petit, vous auriez pas besoin sauf si vous essayez d'envoyer des masses quantité de données (quelque chose de stupide comme 1 million de Go/seconde lol)

Joe

+0

Stupide? Que saurais-tu? Aucune upvotes je vois. –

+0

Si la vitesse du réseau est le facteur limitant, votre choix de langages de programmation devient beaucoup moins pertinent. –