Строка Python 'join' быстрее (?), Чем '+', но что здесь не так? - PullRequest
31 голосов
/ 29 августа 2009

Я спросил самый эффективный метод массовой динамической конкатенации строк в предыдущем посте, и мне предложили использовать метод join , лучший, самый простой и быстрый способ сделать это (как все говорили) , Но пока я играл с конкатенацией строк, я обнаружил некоторые странные (?) Результаты. Я уверен, что что-то происходит, но я не могу этого не понять. Вот что я сделал:

Я определил эти функции:

import timeit
def x():
    s=[]
    for i in range(100):
        # Other codes here...
        s.append("abcdefg"[i%7])
    return ''.join(s)

def y():
    s=''
    for i in range(100):
        # Other codes here...
        s+="abcdefg"[i%7]
    return s

def z():
    s=''
    for i in range(100):
        # Other codes here...
        s=s+"abcdefg"[i%7]
    return s

def p():
    s=[]
    for i in range(100):
        # Other codes here...
        s+="abcdefg"[i%7]
    return ''.join(s)

def q():
    s=[]
    for i in range(100):
        # Other codes here...
        s = s + ["abcdefg"[i%7]]
    return ''.join(s)

Я старался, чтобы другие функции (кроме конкатенации) почти одинаковы во всех функциях. Затем я проверил следующее с результатами в комментарии (используя Python 3.1.1 на 32-битной машине Windows):

timeit.timeit(x) # 31.54912480500002
timeit.timeit(y) # 23.533029429999942 
timeit.timeit(z) # 22.116181330000018
timeit.timeit(p) # 37.718607439999914
timeit.timeit(q) # 108.60377576499991

Это означает, что strng = strng + dyn_strng является самым быстрым. Хотя разница во времени не столь значительна (кроме последней), но я хочу знать, почему это происходит. Это потому, что я использую Python 3.1.1 и это обеспечивает '+' как наиболее эффективный? Должен ли я использовать '+' в качестве альтернативы join ? Или я сделал что-то очень глупое? Или что? Пожалуйста, объясните ясно.

Ответы [ 11 ]

0 голосов
/ 29 августа 2009

Конкатенация строк была намного медленнее, чем в Python 2.5, когда он по-прежнему создавал новую копию для каждой конкатенации строк, а не добавлялся к оригиналу, в результате чего метод join () стал популярным обходным путем.

Вот старый тест, демонстрирующий старую проблему: http://www.skymind.com/~ocrow/python_string/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...