У меня есть часть кода, которая возьмет строку и повторит ее так, что длина строки равна 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'
Есть ли способ его оптимизировать? Мне нужна эта операция, чтобы быть быстрой, так как она будет использоваться много. Обратите внимание, что это также необходимо для работы со списками.
Это может быть немного быстрее:
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 окрашивает вещи так, как если бы это был комментарий (как на С++).
Если вы действительно хотите оптимизировать, что вам нужно переписать свою функцию в C как расширение для python.
Здесь вы найдете информацию здесь. Извините за мой английский, я новичок в этом.
Здесь нет необходимости делать с плавающей запятой; в старых версиях Python просто скажите "int (length)/len (string)", а в новых версиях вы можете использовать оператор "//". Когда вы получите результат, вы можете просто добавить 1, чтобы убедиться, что он достаточно длинный. Или, за счет нескольких дополнительных дополнений, вы можете быть более точными и никогда не заставлять начальную строку слишком долго:
...
return (data * ((int(length) + len(data) - 1) / len(data)))[:length]
Вместо int(math.ceil(float(length) / len(data)))
вы можете просто использовать length/len(data) + 1
. Это не совсем то же самое, но должно работать также.
И прежде чем пытаться сделать это быстрее, уверены ли вы, что эта функция является узким местом производительности? Сколько тысяч раз вы будете называть его каждую секунду?
Чтобы узнать, какой вариант функции является самым быстрым, вы должны его профиль, timeit
, как правило, полезен там.
repeat("Hello World", 22)
быстрее, чем"Hello World" * 22
string * n
.