2013-04-22 3 views
2

Я нахожу, что конкатенация строк, похоже, меньше байт-кода на python, чем объединение списка.Действительно ли список соединяется быстрее, чем конкатенация строк в python?

Это пример.

test.py:

a = ''.join(['a', 'b', 'c']) 
b = 'a' + 'b' + 'c' 

Тогда я исполню python -m dis test.py. я получил следующий питона байткод (Python 2.7):

 
    1   0 LOAD_CONST    0 ('') 
       3 LOAD_ATTR    0 (join) 
       6 LOAD_CONST    1 ('a') 
       9 LOAD_CONST    2 ('b') 
      12 LOAD_CONST    3 ('c') 
      15 BUILD_LIST    3 
      18 CALL_FUNCTION   1 
      21 STORE_NAME    1 (a) 

    3   24 LOAD_CONST    6 ('abc') 
      27 STORE_NAME    2 (b) 
      30 LOAD_CONST    4 (None) 
      33 RETURN_VALUE 

Очевидно, что байткод число конкатенации является less.It только загрузка строки 'abc' непосредственно.

Может ли кто-нибудь объяснить, почему мы всегда говорим, что объединение в список намного лучше?

+2

Потому что вы не всегда знаете, какие строки вы собираетесь объединить. Использование '+' или использование 'sum()' для многих строк, которые вы не знаете заранее, в конечном итоге приводит к квадратичному времени выполнения, в отличие от оптимизированного '.join'. – jamylak

+0

Это будет изменяться в случае использования. Но в целом, да. См. Http://www.skymind.com/~ocrow/python_string/ – Shane

+1

Обратите внимание, что 'b = 'a' + 'b' + 'c'' использует постоянную фальцовку, поскольку все три операнда известны во время компиляции , Попробуйте что-то вроде 'b = a1 + a2 + a3', и вы увидите более сложный байт-код. – chepner

ответ

9

From Efficient String Concatenation in Python

Method 1: 'а' + Ь '+ 'с'

Method 6: а = '' .join ([ 'а', 'б', 'с'])

20000 целых чисел были объединены в строку 86kb долго:

pic

   Concatenations per second  Process size (kB) 
    Method 1    3770     2424 
    Method 6    119,800     3000 

Вывод: ДА, str.join() является значительно быстрее тогда типичных конкатенаций (str1+str2).

+0

Это метод 6, который использует соединение, а не метод 3 – marcadian

+0

@marcadian Спасибо за указание. глупая опечатка. –

3

Поскольку

''.join(my_list) 

гораздо лучше, чем

my_list[0] + my_list[1] 

и лучше, чем

my_list[0] + my_list[1] + my_list[2] 

и лучше, чем

my_list[0] + my_list[1] + my_list[2] + my_list[3] 

и лучше ...

Короче:

print 'better than' 
print ' + '.join('my_list[{}]'.format(i) for i in xrange(x)) 

для любого x.

3

Не верьте! Всегда получайте доказательства!

Источник: Я смотрел на исходный код python на час и вычислил сложности!

Мои выводы.

Для 2-х строк.(Предположим, что n - длина обеих строк)

Concat (+) - O(n) 
Join - O(n+k) effectively O(n) 
Format - O(2n+k) effectively O(n) 

Для более чем 2 строк. (Предположим, что п является длина всех строк)

Concat (+) - O(n^2) 
Join - O(n+k) effectively O(n) 
Format - O(2n+k) effectively O(n) 

РЕЗУЛЬТАТ:

Если у вас есть две строки технически конкатенации (+) лучше, эффективно, хотя это точно так же, как присоединиться и формат.

Если у вас более двух строк, concat становится ужасным, а объединение и формат фактически одинаковы, хотя технически объединение немного лучше.

РЕЗЮМЕ:

Если вы не заботиться о эффективности использования какой-либо из указанных выше. (Хотя, так как вы задали вопрос, я предполагаю, что вы заботитесь)

Посему -

Если у вас есть 2 строки с помощью CONCAT Если у вас есть более чем две строки (все строки) (если не в петлю!) (или в цикле) используйте join Если у вас есть что-то не строки, используйте формат, потому что duh.

Надеюсь, это поможет!

Смежные вопросы