2009-12-15 14 views
10

la mia domanda si riferisce semplicemente alla differenza di prestazioni tra un socket in C e in Python. Dato che la mia build di Python è CPython, presumo sia simile, ma sono curioso di sapere se qualcuno abbia effettivamente dei "veri" benchmark o almeno un'opinione basata su prove.Prestazioni C/Python Socket?

mie logiche è come tale:

  • presa C molto più veloce? quindi scrivere un'estensione C .
  • non/a malapena una differenza? continuare a scrivere in Python e capire come ottenere il controllo a livello di pacchetto (Scapy? Dpkt?)

Sono sicuro che qualcuno vorrà sapere sia per contesto o curiosità. Ho in programma di costruire una sorta di proxy per me stesso (non per la navigazione in Internet, l'anonimato, ecc.) E legherò l'applicazione che voglio utilizzare con essa su una porta specifica. Quindi, tutti i pacchetti su detta porta verranno accodati, l'intestazione dell'indirizzo modificata e quindi inviata, ecc. Ecc.

Grazie in anticipo.

risposta

12

In generale, i socket in Python funzionano bene. Ad esempio, l'implementazione di riferimento del server tracker BitTorrent è scritta in Python.

Durante le operazioni di rete, la velocità della rete è solitamente il fattore limitante. Cioè, ogni possibile piccola differenza di velocità tra C e il codice socket di Python è completamente oscurata dal fatto che stai facendo networking di qualche tipo.

Tuttavia, la descrizione di ciò che si desidera fare indica che si desidera ispezionare e modificare singoli pacchetti IP . Questo è al di là delle capacità delle librerie di rete standard di Python ed è in ogni caso un'operazione molto dipendente dal SO. Piuttosto che chiedere "quale è più veloce?" dovrai prima chiedere "è possibile?"

+0

Grazie Greg. Hai particolarmente ragione riguardo a "è possibile?" Non credo che lo sia. dpkt permette la possibilità di costruire pacchetti, ma sono sicuro di non poter usare il socket python a livello di pacchetto (contro il suo scopo di astrazione). Quindi, credo che dovrò scrivere un'estensione C in modo da poter usare la libreria netfilter che permetterebbe di farlo. Ma ... questo potrebbe richiedere che io faccia le prese in C (non lo so, non ho mai fatto un'estensione C prima). – Kevin

+1

@ Kevin, perché sei sicuro di non poterlo fare? Il supporto socket "raw" non è adatto? (Vedi l'ultimo esempio alla fine di http://docs.python.org/library/socket.html per i principianti.) –

1

Penso che C sarebbe più veloce, ma Python sarebbe molto più facile da gestire e da usare.

la differenza sarebbe così piccolo, non avrebbe bisogno a meno che non si stava tentando di inviare masse quantità di dati (qualcosa di stupido come 1 milione di GB/secondo lol)

joe

+0

Stupido? Cosa vorresti sapere? Nessun upvot che vedo. –

+0

Se la velocità di rete è il fattore limitante, la scelta dei linguaggi di programmazione diventa molto meno rilevante. –

Problemi correlati