3
\$\begingroup\$
tablou = input("Enter values delimited by space: ")
b = tablou.split()
t = [] # initial list with int() contents
for l in b:
 r = int(l)
 t.append(r)

I have to do multiple assignments which require working with lists of integers/floats. Above is what I'm using for converting a string to a proper list of integers. I was wondering if there's any way to optimize the code in a such way that it won't need to use memory to keep tablou, b and the final list. I would be actually working with t

I'm not sure if I used the right terms to describe the issue, I'm still learning.

AJNeufeld
35.2k5 gold badges41 silver badges103 bronze badges
asked Oct 16, 2019 at 19:34
\$\endgroup\$

1 Answer 1

6
\$\begingroup\$

Releasing memory

If you assign None to your variables, their contents is lost and the memory will (eventually) be reclaimed.

tablou = input("Enter values delimited by space: ")
b = tablou.split()
tablou = None
t = [] # initial list with int() contents
for l in b:
 r = int(l)
 t.append(r)
b = None
l = None
r = None

Forgetting the variables

The variables tablou, l, b, and r will still exist; they will just contain the value None. If you accidentally use the variable tablou again, you won't get a NameError: name 'tablou' is not defined, although you may get an error stating the operation cannot be performed on the value None.

Better would be to delete the variables when they are no longer needed:

del tablou
del l, b, r

After deleting the variables, it is an error to refer to them again, without first storing a value under that name.

List Comprehension

Repeatedly appending values to a list is an expensive operation. It is usually faster to create the list using "list comprehension".

First, note that instead of this ...

t = []
for l in b:
 r = int(l)
 t.append(r)

... you could write this, eliminating the r variable:

t = []
for l in b:
 t.append(int(l))

Then, you can replace the list creation, loop, append with the following:

t = [ int(l) for l in b ]

This does the same thing as the former code, but without the repeated append call. As a bonus, the list comprehension variable, l does not escape into the local scope; there is no need to del l.

Mapping

Applying the same operation to every element of a list is called a "mapping", and Python comes with a built in function map() to do just that.

In your specific case, you are calling int( ) on every item in the list b, so instead of:

t = [ int(l) for l in b ]

you could write:

t = list(map(int, b))

Advance topic: The map() function actually returns an iterator, rather than a list. In many cases, you can avoid the call to list(), which iterates over all the items the iterator can produce and builds a list of out them, and simply use the returned iterator directly.

One-liner

You can reduce your code to one line, removing all temporary variables, using nested calls:

t = list(map(int, input("Enter values delimited by space: ").split()))

I don't recommend it, however. It does not result in easy-to-understand code. It is better to separate "user input" from "processing".

Variable Names

t, r, l and b are horrible variable names. Name the variables with longer, descriptive names.

answered Oct 16, 2019 at 22:21
\$\endgroup\$

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.