Оптимизация: повторение строк Python - PullRequest
1 голос
/ 20 июня 2010

У меня есть кусок кода, который будет принимать строку и повторять ее так, чтобы длина строки была х.

>>> 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'

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

Ответы [ 4 ]

3 голосов
/ 20 июня 2010

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

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

Я говорю «может», потому что МНОГО зависит от типичных string и length! С 'Hello World' и 61 я рассчитал это (на старом ноутбуке Mac) на 1 микросекунду против 1,66 микросекунды для вас; с 'Hello World'*100 и 61*123, 2,08 микросекунды против 2,68 для вашего. Просто как быстро вам требуется, какой длины строки и для каких типичных значений length?

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

0 голосов
/ 20 июня 2010

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

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

0 голосов
/ 20 июня 2010

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

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

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

0 голосов
/ 20 июня 2010

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

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