лучшая версия : ответ гнибблера
Поскольку вам нужна скорость (миллионы раз много), я профилировал.Этот примерно в два раза быстрее, чем разделить список:
i = 0
while 1:
if mystr[i] == ',': break
i += 1
mystr = mystr[i+1:] + ', ' + latest_value
Предполагается, что после запятой стоит один пробел.Если это проблема, вы можете использовать:
i = 0
while 1:
if mystr[i] == ',': break
i += 1
mystr = mystr[i+1:].strip() + ', ' + latest_value
, который лишь немного медленнее, чем оригинал, но гораздо более устойчивый.Вам решать, с какой скоростью вам нужно выжать.Они оба предполагают, что в строке будет запятая, и в случае невозможности ее появления поднимут IndexError
.Безопасная версия:
i = 0
while 1:
try:
if mystr[i] == ',': break
except IndexError:
i = -1
break
i += 1
mystr = mystr[i+1:].strip() + ', ' + latest_value
Опять же, это все еще значительно быстрее, чем разделение строки, но добавляет надежности за счет скорости.
Вот время, которое это приводит.Вы можете видеть, что четвертый метод заметно быстрее, чем третий (самый надежный) метод, но немного медленнее, чем первые два метода.Это самое быстрое из двух надежных решений, хотя, если вы не уверены, что в ваших строках будут запятые (т. Е. Если бы их не было, это уже считалось бы ошибкой), то я все равно использовал бы его.
$ python -mtimeit -s 'из тестов импорта строк, method1' 'method1 (tests [0], "10")' 1000000 циклов, лучшее из 3: 1,34 usec на цикл
$ python -mtimeit -s'from strings import tests, method2' 'method2 (tests [0], "10")' 1000000 циклов, лучше всего 3: 1,34 usec на цикл
$ python -mtimeit -s'из тестов импорта строк,method3 '' method3 (tests [0], "10") '1000000 циклов, лучшее из 3: 1,5 usec на цикл
$ python -mtimeit -s'из строк импортировать тесты, method4' 'method4 (тесты[0], "10") '1000000 циклов, лучшее из 3: 1,38 usec на цикл
$ python -mtimeit -s'из тестов импорта строк, method5' 'method5 (tests [0], "10") '100000 циклов, лучшее из 3: 1,18 usec на цикл
Это ответ Гнибблера