Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622

Что быстрее конкатенация, формат или join строк?

26.07.2016, 00:16. Показов 4438. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Будучи начинающим питоноводом озадачился вопросом скорости выполнения кода.
Прочитав несколько статеек, несколько в непонятках нахожусь. Практически везде не рекомендуют сцеплять строки сложением, а использовать для этого функции или форматирование. Провел эксперимент в PyCharm 2016.1.4 и вот какие результаты получились для трех вариантов:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from time import time
 
class Profiler(object):
    def __enter__(self):
        self._Start = time()
    def __exit__(self, type, value, traceback):
        print("Elapsed time: {:.3f} sec".format(time() - self._Start))
 
Count = 100000
with Profiler() as p:
    for i in range(1, Count):
        Result = "начало"
        Result = "%s середина " % Result
        Result = "%sконец" % Result
print(Result)
 
with Profiler() as p:
    for i in range(1, Count):
        Result = " ".join(('начало','середина','конец'))
print(Result)
 
with Profiler() as p:
    for i in range(1, Count):
        Result = "начало"
        Result += " середина "
        Result += "конец"
print(Result)
Elapsed time: 0.053 sec
начало середина конец
Elapsed time: 0.026 sec
начало середина конец
Elapsed time: 0.036 sec
начало середина конец

Как видно из результатов - лидером оказался join, чуток медленнее сложение, а вот форматный вывод серьезно отстает.
И вот возник вопрос, это особенность версии PyCharm или общая тенденция?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.07.2016, 00:16
Ответы с готовыми решениями:

Что быстрее JOIN, IN или EXISTS
У меня две таблицы: A(id,a2) и B(a_id,b2)//A.id - PK, B.a_id - FK N - количество записей в А , M - количество записей в B Что...

Какой запрос правильнее и работает быстрее INNER JOIN или WHERE?
Доброго времени суток. Столкнулся с такой проблемой, что мой сайт дает нагрузку на БД и хостер стал слать предупреждения. Стал...

Оптимизация кода, структуры базы, или что еще можно сделать что бы быстрее работало!?
Всем привет! Господа, выручайте. Не пойму как еще оптимизировать... Есть куча связанных таблиц. Нужно выводить статистику используя...

17
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
26.07.2016, 00:46
В данном случае разница маленькая, но для длинных последовательностей сложение действительно мееедленное, и PyCharm здесь не при чём...
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
26.07.2016, 01:33  [ТС]
Я просто сейчас конвертер БД реализую, где подобных операций в цикле со строками ожидается за десятки миллионов. Объем конвертируемых данных очень приличный, так для меня выигрыш скорости в 50% на 3 операциях сцепления - уже очень впечатляющий результат.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
26.07.2016, 07:20
Не правильно так проводить замеры производительности кода. Во 1 time не слишком подходит для этих целей, а во 2 сам цикл на пример тоже вносит "погрешность" измерения, потому что на его исполнение тоже нужно время.
Для замеров есть специальные библиотеки + профилировщики.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import timeit
 
 
def test():
    res = " ".join(('начало', 'середина', 'конец'))
 
 
def test1():
    res = '{} {} {} '.format('начало', 'середина', 'конец')
 
 
def test2():
    res = 'начало' + 'середина' + 'конец'
 
 
print(timeit.timeit("test()", setup="from __main__ import test", number=100000))
print(timeit.timeit("test1()", setup="from __main__ import test1", number=100000))
print(timeit.timeit("test2()", setup="from __main__ import test2", number=100000))
1
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
26.07.2016, 20:19  [ТС]
Возможно вы в чем-то правы, но ваш вариант тоже несколько оторван от реальности, не буду же я в реальном коде так писать. Как раз мой вариант с циклами, будет более близок к реальному коду. А вот результаты которые дает ваш вариант, несколько поменяли иные:
0.02749829302964452
0.058981702237210526
0.009178463550786164
Самым быстрым оказалось сложение, и самым медленным снова форматирование.
Худшие результаты с форматным выводом в обоих случаях тоже неплохой аргумент отказаться по возможности, от такого способа работы со строками.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
26.07.2016, 20:35
Пытливый, в твоем приемере цикл используется не для вычислениий, а для того, чтобы получить цифры на которых нормально будет виден выйгрышь какого либо из методов. По этому все нормально, даже если тебе надо запрофилироовать код в котором есть цикл, кто тебе мешает поместить в функцию цикл?
0
Заблокирован
26.07.2016, 21:49
Мб раскажешь подробней какую операцию тебе надо провести в конвертере?
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
26.07.2016, 23:31  [ТС]
даже если тебе надо запрофилироовать код в котором есть цикл, кто тебе мешает поместить в функцию цикл
Ну я еще не настолько продвинутый питоновед, что-бы так сходу перестроится
Мб раскажешь подробней какую операцию тебе надо провести в конвертере?
могу даже пример нескольких самых востребованных функции показать:
Каждое поле в таблице вот в такую обертку надо завернуть:
Python
1
2
3
4
def OutField(Name, Value):
    Result = ""
    if Value: Result = "<%s>%s</%s>%s" % (Name, Value, Name, chr(13))
    return Result
Некоторые поля уже по другому надо обработать:
Python
1
2
def OutKeyField(Value, Alias="ID"):
    return "<ID>%s%s</ID>%s" % (Alias, Value, chr(13))
третий тип поля оформляется уже так:
Python
1
2
3
4
def OutKeyLink(Value, Alias="ID"):
    Result = ""
    if Value: Result = "%s<enum>%s%s</enum>%s" % (chr(13), Alias, Value, chr(13))
    return Result
ПС: использовать \n вместо chr(13) - у меня нельзя
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
27.07.2016, 07:11
Цитата Сообщение от Пытливый Посмотреть сообщение
ПС: использовать \n вместо chr(13) - у меня нельзя
Если тебе нужен перевод каретки, то используй экранированную последовательстеность
Python
1
'\r'
http://pythonworld.ru/tipy-dan... strok.html

Цитата Сообщение от Пытливый Посмотреть сообщение
Каждое поле в таблице вот в такую обертку надо завернуть
Просто используешь join и все, как ты видел, он не медленно работает.

Цитата Сообщение от Пытливый Посмотреть сообщение
OutKeyField
Такую нотацию можно использовать только для названия классов, функции (и переменные) так называть нельзя!

Цитата Сообщение от Пытливый Посмотреть сообщение
def OutField(Name, Value):
Python
1
def out_field(name, value):
Цитата Сообщение от Пытливый Посмотреть сообщение
Result = ""
Python
1
res = ''
Вот так надо.
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
27.07.2016, 14:03
Python
1
2
3
4
def out_field(name, value):
    if value:
        return "<{0}>{1}</{0}>\n".format(name, value)
    return "" #хотя может вообще не возвращать? Итак будет пусто
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
27.07.2016, 19:33  [ТС]
Все это правильные советы, но я немного умолчал. У меня используется встроенный инерпретатор питона, версия которого мне неведома, в котором я много чего не могу использовать, например просто ввести символ ' c клавиатуры просто невозможно, только ". В нем нет поддержки и таких функций как "<{0}>{1}</{0}>\n".format или очень полезной конструкции with.

Насчет '\r', попробую. Спасибо
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
27.07.2016, 20:37
Пытливый, это ты "хранимую процедуру" для postgresql пишешь? Или где это у тебя встроенный куда-то интерпретатор?
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
27.07.2016, 22:58  [ТС]
Да, встроенный в Легенду, если слышал про такого зверя

Добавлено через 5 минут
Вот за '\r' дополнительно спасибо, работает, а то меня самого напрягает код с chr(13).
0
21 / 21 / 2
Регистрация: 31.12.2015
Сообщений: 100
28.07.2016, 21:29
Вообще пишут, что join быстрее.
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
29.07.2016, 14:55
Цитата Сообщение от Пытливый Посмотреть сообщение
версия которого мне неведома
Python
1
2
import sys
print(sys.version)
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
29.07.2016, 22:28  [ТС]
Сяп, не знал о такой штуке. Оказалась ver 2.4.2
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
30.07.2016, 00:23
Ууу, как все плохо....
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
31.07.2016, 17:20  [ТС]
Ну не все так плохо
Я уже все почти сделал, сейчас причесываю, красоту навожу, оптимизирую и т.д.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.07.2016, 17:20
Помогаю со студенческими работами здесь

Сравнение строк или какой код быстрее работает ?
пример strcmp(AnsiString(DBGrid1-&gt;Columns-&gt;Items-&gt;FieldName).c_str(), AnsiString(Main-&gt;IndexFieldNames).c_str()); есть ещё ...

Что быстрее: i++ или ++i ?
Только что прочитала в интернете, что префиксный итератор быстрее, чем постфиксный. Так ли это? Если так и если в С++ все есть обьект, то...

Что быстрее 7 или XP?
Есть нетбук Acer Aspire One D257 с параметрами: Производитель: Intel ...

Что быстрее WHERE x=1 или WHERE x IN (1)?
Есть какие-нибудь сведения насчет данных команд WHERE x=1 или WHERE x IN (1)? Вопрос в том, что есть некая функция, в которой выполняется...

if или switch? что быстрее
Здравствуйте. Подскажите пожалуйста,что быстрее будет выполняться много условий if ,или switch int z = 5; if (z==4) z= 3; if...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru