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

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

26.07.2016, 00:16. Показов 4399. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru