Подтвердить что ты не робот

Является ли `extend` быстрее, чем` + = `?

В python мы можем объединить списки двумя способами:

  • lst.extend(another_lst)
  • lst + = another_lst

Я думал, что extend будет быстрее, чем с помощью +=, потому что он повторно использует список вместо создания нового с помощью двух других.

Но когда я тестирую его с помощью timeit, оказывается, что += быстрее,

>>> timeit('l.extend(x)', 'l = range(10); x = range(10)')
0.16929602623
>>> timeit('l += x', 'l = range(10); x = range(10)')
0.15030503273
>>> timeit('l.extend(x)', 'l = range(500); x = range(100)')
0.805264949799
>>> timeit('l += x', 'l = range(500); x = range(100)')
0.750471830368

Что-то не так с кодом, который я ввел в timeit?

4b9b3361

Ответ 1

EDIT: я тестировал производительность, и я не могу воспроизвести различия до любого значительного уровня.


Здесь байт-код - благодаря @John Machin за указание несоответствий.

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

Обратите внимание, что extend использует CALL_FUNCTION вместо INPLACE_ADD. Любые тривиальные различия в производительности могут быть с этим связаны.