Конкатенация строк по сравнению со строковой заменой в Python

Lodash.js (надмножество Underscore.js )

Хорошо не добавлять рамки для каждой простой части логики, но полагаться

Lodash выпускает очень чистый код и способствует более функциональному программированию , который приводит к тому, что он работает на хорошо проверенных средах утилиты, ускоряет разработку и уменьшает количество написанных ошибок. в меньшем количестве ошибок. В одном взгляде становится ясно, что за цель, если код.

Проблема OP может быть просто решена как:

const sortedObjs = _.sortBy(objs, 'last_nom');

Подробнее? Например. у нас есть следующий вложенный объект:

const users = [
  { 'user': {'name':'fred', 'age': 48}},
  { 'user': {'name':'barney', 'age': 36 }},
  { 'user': {'name':'wilma'}},
  { 'user': {'name':'betty', 'age': 32}}
];

Теперь мы можем использовать стенографию _. свойство user.age, чтобы указать путь к свойству, которое должно быть сопоставлено. Мы будем сортировать объекты пользователя по вложенному возрасту. Да, это позволяет сопоставлять вложенные свойства!

const sortedObjs = _.sortBy(users, ['user.age']);

Хотите, чтобы это было отменено? Нет проблем. Используйте _. Reverse .

const sortedObjs = _.reverse(_.sortBy(users, ['user.age']));

Хотите комбинировать оба с помощью Chaining ?

const sortedObjs = _.chain(users).sortBy('user.age').reverse().value();

98
задан gotgenes 18 December 2008 в 04:56
поделиться

7 ответов

Конкатенация (значительно) быстрее согласно моей машине. Но стилистически, я готов заплатить цену замены, если производительность не очень важна. Ну, и если мне нужно форматирование, нет никакой потребности даже задать вопрос... нет никакой опции, кроме как использовать интерполяцию/шаблонную обработку.

>>> import timeit
>>> def so_q_sub(n):
...  return "%s%s/%d" % (DOMAIN, QUESTIONS, n)
...
>>> so_q_sub(1000)
'http://stackoverflow.com/questions/1000'
>>> def so_q_cat(n):
...  return DOMAIN + QUESTIONS + '/' + str(n)
...
>>> so_q_cat(1000)
'http://stackoverflow.com/questions/1000'
>>> t1 = timeit.Timer('so_q_sub(1000)','from __main__ import so_q_sub')
>>> t2 = timeit.Timer('so_q_cat(1000)','from __main__ import so_q_cat')
>>> t1.timeit(number=10000000)
12.166618871951641
>>> t2.timeit(number=10000000)
5.7813972166853773
>>> t1.timeit(number=1)
1.103492206766532e-05
>>> t2.timeit(number=1)
8.5206360154188587e-06

>>> def so_q_tmp(n):
...  return "{d}{q}/{n}".format(d=DOMAIN,q=QUESTIONS,n=n)
...
>>> so_q_tmp(1000)
'http://stackoverflow.com/questions/1000'
>>> t3= timeit.Timer('so_q_tmp(1000)','from __main__ import so_q_tmp')
>>> t3.timeit(number=10000000)
14.564135316080637

>>> def so_q_join(n):
...  return ''.join([DOMAIN,QUESTIONS,'/',str(n)])
...
>>> so_q_join(1000)
'http://stackoverflow.com/questions/1000'
>>> t4= timeit.Timer('so_q_join(1000)','from __main__ import so_q_join')
>>> t4.timeit(number=10000000)
9.4431309007150048
55
ответ дан Nilesh 5 November 2019 в 12:21
поделиться

опасаться связывать строки в цикле! стоимость конкатенации строк пропорциональна длине результата. Цикличное выполнение приводит Вас прямо к земле N-squared. Некоторые языки оптимизируют конкатенацию к последний раз выделенной строке, но это опасно для рассчитывания на компилятор для оптимизации квадратичного алгоритма вниз к линейному. Лучше всего использовать примитив (join?), который берет весь список строк, делает единственное выделение и связывает их, все в одном идут.

12
ответ дан Norman Ramsey 5 November 2019 в 12:21
поделиться

Не забывайте об именованной замене:

def so_question_uri_namedsub(q_num):
    return "%(domain)s%(questions)s/%(q_num)d" % locals()
23
ответ дан too much php 5 November 2019 в 12:21
поделиться

То, что Вы хотите связать/интерполировать и как Вы хотите отформатировать результат, должно управлять Вашим решением.

  • Строковая интерполяция позволяет Вам легко добавлять форматирование. На самом деле Ваша строковая версия интерполяции не делает того же самого как Вашей версии конкатенации; это на самом деле добавляет дополнительную наклонную черту вправо перед q_num параметр. Чтобы сделать то же самое, необходимо было бы записать return DOMAIN + QUESTIONS + "/" + str(q_num) в том примере.

  • Интерполяция помогает отформатировать численные данные; "%d of %d (%2.2f%%)" % (current, total, total/current) было бы намного менее читаемо в форме конкатенации.

  • Конкатенация полезна, когда у Вас нет постоянного числа объектов для строкового представления.

кроме того, знайте, что Python 2.6 представляет новую версию строковой интерполяции, названной строка, обрабатывающая по шаблону :

def so_question_uri_template(q_num):
    return "{domain}/{questions}/{num}".format(domain=DOMAIN,
                                               questions=QUESTIONS,
                                               num=q_num)

Строковая шаблонная обработка намечена для возможной замены % - интерполяция, но этого не произойдет долгое время, я думаю.

10
ответ дан Tim Lesher 5 November 2019 в 12:21
поделиться

"Поскольку конкатенация строк видела большие повышения производительности..."

, Если производительность имеет значение, это хорошо для знания.

Однако проблемы производительности, которые я, никогда видел не сводились к строковым операциям. Я обычно входил в проблему с вводом-выводом, сортировкой и O ( <глоток> n 2 ) операции, являющиеся узкими местами.

, Пока строковые операции не являются ограничителями производительности, я буду придерживаться вещей, которые очевидны. Главным образом это - замена, когда это - одна строка или меньше, конкатенация, когда это имеет смысл и шаблонный инструмент (как Мако), когда это является большим.

11
ответ дан S.Lott 5 November 2019 в 12:21
поделиться

Помните, стилистические решения практические решения, если Вы когда-нибудь планируете поддержание или отладку Вашего кода :-) Существует известная кавычка от Knuth (возможно заключающий Hoare в кавычки?): "Мы должны забыть о маленькой эффективности, сказать приблизительно 97% времени: преждевременная оптимизация является корнем всего зла".

, пока Вы боитесь (говорить), поворачивают O (n) задача в O (n <глоток> 2 ) задача, я пошел бы с тем, какой бы ни Вы находите самыми легкими понять..

4
ответ дан John Fouhy 5 November 2019 в 12:21
поделиться

Я использую замену везде, где я могу. Я только использую конкатенацию, если я расту, строка в говорят для цикла.

0
ответ дан Draemon 5 November 2019 в 12:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: