简体   繁体   中英

python optimization: [a, b, c] > [str(a), str(b), str(c)]

I need to turn a list of various entities into strings. So far I use:

all_ents_dead=[] # converted to strings

for i in all_ents:
    all_ents_dead.append(str(i))

Is there an optimized way of doing that?

EDIT: I then need to find which of these contain certain string. So far I have:

matching = [s for s in all_ents_dead if "GROUPS" in s]

Whenever you have a name = [] , then name.append() in a loop pattern, consider using a list comprehension . A list comprehension builds a list from a loop, without having to use list.append() lookups and calls, making it faster:

all_ents_dead = [str(i) for i in all_ents]

This directly echoes the code you had, but with the expression inside all_ents_dead.append(...) moved to the front of the for loop.

If you don't actually need a list, but only need to iterate over the str() conversions you should consider lazy conversion options. You can turn the list comprehension in to a generator expression :

all_ents_dead = (str(i) for i in all_ents)

or, when only applying a function, the faster alternative in the map() function :

all_ents_dead = map(str, all_ents)  # assuming Python 3

both of which lazily apply str() as you iterate over the resulting object. This helps avoid creating a new list object where you don't actually need one, saving on memory. Do note that a generator expression can be slower however; if performance is at stake consider all options based on input sizes, memory constraints and time trials.

For your specific search example, you could just embed the map() call:

matching = [s for s in map(str, all_ents) if "GROUPS" in s]

which would produce a list of matching strings, without creating an intermediary list of string objects that you then don't use anywhere else.

Use the map() function. This will take your existing list, run a function on each item, and return a new list/iterator (see below) with the result of the function applied on each element.

all_ends_dead = map(str, all_ents)

In Python 3+, map() will return an iterator, while in Python 2 it will return a list. An iterator can have optimisations you desire since it generates the values when demanded, and not all at once (as opposed to a list).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM