Оптимизация: повторение строк Python

1

У меня есть часть кода, которая возьмет строку и повторит ее так, что длина строки равна x.

>>> import math
>>> def repeat(data, length):
        return (data * int(math.ceil(float(length) / len(data))))[:length]
>>> repeat("Hello World", 22)
'Hello WorldHello World'
>>> repeat("Hello World", 20)
'Hello WorldHello Wor'

Есть ли способ его оптимизировать? Мне нужна эта операция, чтобы быть быстрой, так как она будет использоваться много. Обратите внимание, что это также необходимо для работы со списками.

  • 0
    Просто интересуюсь. Вы действительно подтвердили, что repeat("Hello World", 22) быстрее, чем "Hello World" * 22
  • 0
    @WoLpH: он решает немного другую проблему. Он хочет, чтобы «Hello World» (или любая строка) повторялась столько раз, сколько необходимо, но не должна превышать N символов в длину. Не то же самое, что string * n .
Показать ещё 1 комментарий
Теги:
string
repeat

4 ответа

3
Лучший ответ

Это может быть немного быстрее:

def repeat(string, length):
  L = len(string)
  return string * (length // L) + string[:length % L]

Я говорю "могу", потому что LOT зависит от типичных string и length! С 'Hello World' и 61, я приурочил это (на старом ноутбуке Mac) в 1 микросекунду против 1,66 микросекунды для вас; с 'Hello World'*100 и 61*123, 2.08 микросекунд против 2.68 для вашего. Просто , как вам нужно, какие строки строк и какие типичные значения length?

Примечание // является "делением на усечение" (просто для обеспечения того, что это работает на Python 3, а также на Python 2;-), хотя Qaru окрашивает вещи так, как если бы это был комментарий (как на С++).

  • 0
    Это несколько ускоряет, Это должно быть достаточно хорошо. Спасибо!
  • 0
    @CMC, пожалуйста!
0

Если вы действительно хотите оптимизировать, что вам нужно переписать свою функцию в C как расширение для python.

Здесь вы найдете информацию здесь. Извините за мой английский, я новичок в этом.

  • 0
    Мне нужно держать его в Python, хотя «Python» и «speed» не очень хорошо сочетаются друг с другом.
0

Здесь нет необходимости делать с плавающей запятой; в старых версиях Python просто скажите "int (length)/len (string)", а в новых версиях вы можете использовать оператор "//". Когда вы получите результат, вы можете просто добавить 1, чтобы убедиться, что он достаточно длинный. Или, за счет нескольких дополнительных дополнений, вы можете быть более точными и никогда не заставлять начальную строку слишком долго:

...
    return (data * ((int(length) + len(data) - 1) / len(data)))[:length]
0

Вместо int(math.ceil(float(length) / len(data))) вы можете просто использовать length/len(data) + 1. Это не совсем то же самое, но должно работать также.

И прежде чем пытаться сделать это быстрее, уверены ли вы, что эта функция является узким местом производительности? Сколько тысяч раз вы будете называть его каждую секунду?

Чтобы узнать, какой вариант функции является самым быстрым, вы должны его профиль, timeit, как правило, полезен там.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню