Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Loop while checking if element in a list in Python

Let's say I have a simple piece of code like this:

for i in range(1000):
    if i in [150, 300, 500, 750]:
        print(i)

Does the list [150, 300, 500, 750] get created every iteration of the loop? Or can I assume that the interpreter (say, CPython 2.7) is smart enough to optimize this away?

like image 441
Joohwan Avatar asked Feb 24 '16 15:02

Joohwan


People also ask

How do you check if an element is in a list Python using loop?

Method 1: Naive MethodIn the Naive method, one easily uses a loop that iterates through all the elements to check the existence of the target element. This is the simplest way to check the existence of the element in the list. Python is the most conventional way to check if an element exists in a list or not.

How do you check if an item is in a list Python?

To check if the item exists in the list, use Python “in operator”. For example, we can use the “in” operator with the if condition, and if the item exists in the list, then the condition returns True, and if not, then it returns False.

Can you loop through a list in Python?

You can loop through the list items by using a while loop. Use the len() function to determine the length of the list, then start at 0 and loop your way through the list items by referring to their indexes.

How do you check if an element is in a list multiple times Python?

Using Count() The python list method count() returns count of how many times an element occurs in list. So if we have the same element repeated in the list then the length of the list using len() will be same as the number of times the element is present in the list using the count().


1 Answers

You can view the bytecode using dis.dis. Here's the output for CPython 2.7.11:

  2           0 SETUP_LOOP              40 (to 43)
              3 LOAD_GLOBAL              0 (range)
              6 LOAD_CONST               1 (1000)
              9 CALL_FUNCTION            1
             12 GET_ITER            
        >>   13 FOR_ITER                26 (to 42)
             16 STORE_FAST               0 (i)

  3          19 LOAD_FAST                0 (i)
             22 LOAD_CONST               6 ((150, 300, 500, 750))
             25 COMPARE_OP               6 (in)
             28 POP_JUMP_IF_FALSE       13

  4          31 LOAD_FAST                0 (i)
             34 PRINT_ITEM          
             35 PRINT_NEWLINE       
             36 JUMP_ABSOLUTE           13
             39 JUMP_ABSOLUTE           13
        >>   42 POP_BLOCK           
        >>   43 LOAD_CONST               0 (None)
             46 RETURN_VALUE      

Hence, the list creation is optimized to the loading of a constant tuple (byte 22). The list (which is in reality a tuple in this case) is not created anew on each iteration.

like image 179
arshajii Avatar answered Oct 12 '22 23:10

arshajii