help with simple script and strings
seth vidal
skvidal at fedoraproject.org
Sun Apr 13 21:05:34 UTC 2008
On Sat, 2008-04-12 at 17:10 -0700, Toshio Kuratomi wrote:
> Kyle VanderBeek wrote:
> > On Sat, Apr 12, 2008 at 04:52:06PM -0400, James Antill wrote:
> >> You can't alter things that you are iterating, the easist fix is:
> >>
> >> for directory in directories[:]:
> >>
> >> ...the others being to create a new list of just what you want, or a
> >> list of what needs to go and then do the .remove() calls on that (these
> >> methods can be worth it, for large lists).
> >
> > Actually, I'd contend this technique gets worse as your list size
> > increases. First, you're making a copy pass, doubling your memory
> > footprint, and then a second pass to actually filter the list down to
> > just the elements you want. That will get slower as your list size
> > increases.
> >
> > Oh, and that reminds me of another way, using the builtin filter():
> >
> > >>> directories = ['20080412', '20080324', 'blahblah', 'latest-dir',
> > 'rawhide-20080410', 'rawhide-20080411', 'rawhide-20080412' , '20080401']
> > >>> filter(lambda x: x.startswith('200'), directories)
> > ['20080412', '20080324', '20080401']
> >
>
> Just a note: This will be much slower than the list comprehension for
> large lists.
>
> That's because function calls have tremendous overhead in python and a
> lambda is just a function without a name. So using filter you make two
> function calls for every entry in the list:
> * lambda [...]
> * str.startswith()
>
> With a list comprehension you only call str.startswith().
>
> As I tell people, if you want readability, write it out fully (James
> Antill's solution or even:
>
> newDirectories = []
> for directory in directories:
> if directory.startswith('200'):
> newDirectories.append(directory)
> directories = newDirectories
>
> If you want speed and code compactness use a list comprehension.
>
And just as another note - you better be doing this several hundred
thousand times to justify the complete unreadability of list
comprehensions.
-sv
More information about the Fedora-python-devel-list
mailing list