Soquetes mais rápidos em Python

Eu tenho um cliente escrito em Python para um servidor, que funciona através da LAN. Alguma parte do algoritmo usa a leitura do soquete intensivamente e está executando cerca de 3-6 vezes maisquase o mesmo escrito em C ++. Quais soluções existem para tornar a leitura do soquete Python mais rápida?

Eu tenho algum buffer simples implementado, e minha classe para trabalhar com sockets se parece com isso:

import socket
import struct

class Sock():
    def __init__(self):
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.recv_buf = b''
        self.send_buf = b''

    def connect(self):
        self.s.connect(('127.0.0.1', 6666))

    def close(self):
        self.s.close()

    def recv(self, lngth):
        while len(self.recv_buf) < lngth:
                self.recv_buf += self.s.recv(lngth - len(self.recv_buf))

        res = self.recv_buf[-lngth:]
        self.recv_buf = self.recv_buf[:-lngth]
        return res

    def next_int(self):
        return struct.unpack("i", self.recv(4))[0]

    def next_float(self):
        return struct.unpack("f", self.recv(4))[0]

    def write_int(self, i):
        self.send_buf += struct.pack('i', i)

    def write_float(self, f):
        self.send_buf += struct.pack('f', f)

    def flush(self):
        self.s.sendall(self.send_buf)
        self.send_buf = b''

P.S .: o perfil também mostra que a maior parte do tempo é gasta lendo soquetes.

Editar: Como os dados são recebidos em blocos com tamanho conhecido, posso ler o bloco inteiro de uma só vez. Então eu mudei meu código para isso:

class Sock():
    def __init__(self):
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.send_buf = b''

    def connect(self):
        self.s.connect(('127.0.0.1', 6666))

    def close(self):
        self.s.close()

    def recv_prepare(self, cnt):
        self.recv_buf = bytearray()
        while len(self.recv_buf) < cnt:
            self.recv_buf.extend(self.s.recv(cnt - len(self.recv_buf)))

        self.recv_buf_i = 0

    def skip_read(self, cnt):
        self.recv_buf_i += cnt

    def next_int(self):
        self.recv_buf_i += 4
        return struct.unpack("i", self.recv_buf[self.recv_buf_i - 4:self.recv_buf_i])[0]

    def next_float(self):
        self.recv_buf_i += 4
        return struct.unpack("f", self.recv_buf[self.recv_buf_i - 4:self.recv_buf_i])[0]

    def write_int(self, i):
        self.send_buf += struct.pack('i', i)

    def write_float(self, f):
        self.send_buf += struct.pack('f', f)

    def flush(self):
        self.s.sendall(self.send_buf)
        self.send_buf = b''

recv'ing from socket parece ótimo neste código. Mas agoranext_int enext_float tornou-se o segundo gargalo, eles levam cerca de 1 ms (3000 ciclos de CPU) por chamada apenas para descompactar. É possível torná-los mais rápidos, como em C ++?

questionAnswers(1)

yourAnswerToTheQuestion