I could use some help making this Python code run faster using only Python code.

Paul Hankin paul.hankin at gmail.com
Fri Sep 21 00:46:53 CEST 2007


On Sep 20, 10:59 pm, Python Maniac <raych... at hotmail.com> wrote:
> I am new to Python however I would like some feedback from those who
> know more about Python than I do at this time.
>
> def scrambleLine(line):
>     s = ''
>     for c in line:
>         s += chr(ord(c) | 0x80)
>     return s
>
> def descrambleLine(line):
>     s = ''
>     for c in line:
>         s += chr(ord(c) & 0x7f)
>     return s
> ...

Well, scrambleLine will remove line-endings, so when you're
descrambling
you'll be processing the entire file at once. This is particularly bad
because of the way your functions work, adding a character at a time
to
s.

Probably your easiest bet is to iterate over the file using read(N)
for some small N rather than doing a line at a time. Something like:

process_bytes = (descrambleLine, scrambleLine)[action]
while 1:
    r = f.read(16)
    if not r: break
    ff.write(process_bytes(r))

In general, rather than building strings by starting with an empty
string and repeatedly adding to it, you should use ''.join(...)

For instance...
def descrambleLine(line):
  return ''.join(chr(ord(c) & 0x7f) for c in line)

def scrambleLine(line):
  return ''.join(chr(ord(c) | 0x80) for c in line)

It's less code, more readable and faster!

--
Paul Hankin




More information about the Python-list mailing list