[Python-Dev] Patch to telnetlib.py
Eric Smith
eric at trueblade.com
Sat Mar 13 19:23:16 CET 2010
Can you create an issue on the bug tracker? Otherwise this will get lost.
Eric.
On 3/13/2010 12:24 PM, gregory dudek wrote:
> 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:
> 1) concatenations string with string.join instead of '+' (which is probably a minor issue)
> 2) 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 = ''
> + self.irawq = 0
>
> def rawq_getchar(self):
> """Get next char from raw queue.
> @@ -516,7 +531,7 @@
> buf = self.sock.recv(50)
> self.msg("recv %r", buf)
> self.eof = (not buf)
> - self.rawq = self.rawq + buf
> + self.rawq = "".join((self.rawq,buf))
>
> def sock_avail(self):
> """Test whether data is available on the socket."""
>
> _______________________________________________
> Python-Dev mailing list
> Python-Dev at python.org
> http://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe: http://mail.python.org/mailman/options/python-dev/eric%2Ba-python-dev%40trueblade.com
>
More information about the Python-Dev
mailing list