List concatenation efficiency

1.1k views Asked by At

Suppose I have two lists, A = [1,2,3,4] and B = [4,5,6]

I would like a list which includes the elements from both A and B. (I don't care if A itself gets altered).

A couple things I could do, and my understanding of them (please tell me if I am wrong):

A.extend(B) (elements of B get added in to A; A itself is altered)

C = A + B (makes a brand new object C, which contains the contents of A and B in it.)

I wanted to understand which is more efficient, so I was wondering if someone can someone please tell me if my assumptions below are incorrect.

In the case of A.extend(B), I'm assuming python only has to do 3 list add operations (the 3 elements of B, each of which it appends to A). However, in doing A + B, doesn't python have to iterate through both lists A and B, in that case doing 7 list add operations? (i.e., it has to make a new list, go through A and put all the elements in it, and then go through B and put all the elements in it).

Am I misunderstanding how the interpreter handles these things, or what these operations do in python?

1

There are 1 answers

0
Amarpreet Singh On

Below is the bytecode analysis of both operations. There are no major performance difference between two. The only difference is that the .extend way involves a CALL_FUNCTION, which is slightly more expensive in Python than the BINARY_ADD.

But this should not be a problem unless of are working on huge data operations.

>>> import dis
>>> a = [1,2,3,4]
>>> b = [4,5,6]
>>> def f1(a,b):
...  a.extend(b)
>>> def f2(a,b):
...  c = a+ b
>>> dis.dis(f1)
  2           0 LOAD_FAST                0 (a)
              3 LOAD_ATTR                0 (extend)
              6 LOAD_FAST                1 (b)
              9 CALL_FUNCTION            1
             12 POP_TOP             
             13 LOAD_CONST               0 (None)
             16 RETURN_VALUE        
>>> dis.dis(f2)
  2           0 LOAD_FAST                0 (a)
              3 LOAD_FAST                1 (b)
              6 BINARY_ADD          
              7 STORE_FAST               2 (c)
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE