Steven Bethard wrote:
jeremit0 wrote:

Steve Holden wrote:

If you want line numbers,. of course, then you can use

  for linenum, line in enumerate(myfile.readlines()):
      ...

Remember that true to Python's philosophy numbering will start at zero.

Is this any better than:

    lines = myfile.readlines()
    for linenum in xrange(len(lines)):
        # Do stuff with lines[linenum] ...


Well, if you use lines[linenum] often in that code, it'll be more efficient to use enumerate (or bind lines[linenum] to a name, which is basically what enumerate is doing for you). Given the file test.py:

--------------------------------------------------
def elines(lines):
    for linenum, line in enumerate(lines):
        x = linenum
        y = line
        z = line

def xlines(lines):
    for linenum in xrange(len(lines)):
        x = linenum
        y = lines[linenum]
        z = lines[linenum]

--------------------------------------------------

Here's what I get with timeit:

[D:\Steve]$ python -m timeit -s"lines = range(10000); import test" "test.elines(lines)"
100 loops, best of 3: 2.85 msec per loop


[D:\Steve]$ python -m timeit -s"lines = range(10000); import test" "test.xlines(lines)"
100 loops, best of 3: 3.18 msec per loop


The other thing worth noting is that enumerate will work with any iterable, while your xrange technique won't. Try:
for linenum, line in enumerate(myfile):
...
and
for linenum in xrange(len(myfile)):
line = myfile[linenum]
...
and see what kind of cool errors you get with the xrange solution. :)


STeVe

Wow that is significant evidence. Thanks for doing that.

This is the first time I have posted to this list. I really like it for two reasons. 1) There are lots of people who are willing to help out and 2) there are so many ideas now I can pick which one I like best. I think I am leaning towards using enumerate.

Thanks,
Jeremy

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to