[Python-Dev] Patch to telnetlib.py (original) (raw)
gregory dudek dudek at cim.mcgill.ca
Sat Mar 13 18:24:27 CET 2010
- Previous message: [Python-Dev] PyPy 1.2, JIT included
- Next message: [Python-Dev] Patch to telnetlib.py
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
The Telnet module telnetlib.py can be very slow -- unusably slow -- for large automated data transfers. There are typically done in raw mode.
The attached patch greatly increased the speed of telnet interactions in raw mode. I submitted this a couple of year ago, but it was for an older branch of python.
There are 2 key things being done:
- concatenations string with string.join instead of '+' (which is probably a minor issue)
- wholesale appending the raw and processed buffers when the IAC character is not found. The should be examined carefully since I am not an expert in the Telnet protocol, but it seems to work very well giving me a 5x speedup.
--- installed/telnetlib.py 2010-02-02 22:57:58.000000000 -0500 +++ telnetlib.py 2010-03-13 12:17:02.000000000 -0500 @@ -30,6 +30,7 @@
- timeout should be intrinsic to the connection object instead of an option on one of the read calls only
+Modified by G. Dudek for greater efficiency. """
@@ -420,6 +421,14 @@ """ buf = ['', ''] try:
if self.rawq:
if not IAC in self.rawq:
# speed hack, no IAC just grab whole queue. --Dudek
buf[self.sb] = "".join((buf[self.sb] , self.rawq))
self.cookedq = "".join((self.cookedq , buf[0] ))
self.sbdataq = "".join((self.sbdataq , buf[1] ))
self.rawq_flush()
return while self.rawq: c = self.rawq_getchar() if not self.iacseq:
@@ -428,7 +437,7 @@ if c == "\021": continue if c != IAC:
buf[self.sb] = buf[self.sb] + c
buf[self.sb] = "".join((buf[self.sb] , c)) continue else: self.iacseq += c
@@ -480,8 +489,14 @@ self.iacseq = '' # Reset on EOF self.sb = 0 pass
self.cookedq = self.cookedq + buf[0]
self.sbdataq = self.sbdataq + buf[1]
self.cookedq = "".join((self.cookedq , buf[0] ))
self.sbdataq = "".join((self.sbdataq , buf[1] ))
- def rawq_flush(self):
""" Set the queue to empty status """
self.rawq = ''
def rawq_getchar(self): """Get next char from raw queue.self.irawq = 0
@@ -516,7 +531,7 @@ buf = self.sock.recv(50) self.msg("recv %r", buf) self.eof = (not buf)
self.rawq = self.rawq + buf
def sock_avail(self): """Test whether data is available on the socket."""self.rawq = "".join((self.rawq,buf))
- Previous message: [Python-Dev] PyPy 1.2, JIT included
- Next message: [Python-Dev] Patch to telnetlib.py
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]