Я рассчитал все методы в текущих ответах (с Python 3.7.2, macOS High Sierra).
b()
был лучшим в целом, c()
был лучшим, когда не было найдено совпадений.
def b(text):
re.sub(r"\*\*+", "*", text)
# aka squeeze()
def c(text):
while "*" * 2 in text:
text = text.replace("*" * 2, "*")
return text
Ввод 1, без повторов:
'a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*'
- а) 10000 циклов, лучшее из 5: 24,5 мксек на цикл
- b) 100000 циклов, лучшее из 5: 3,17 мксек на цикл
- c) 500000 циклов, лучшее из 5: 508 нс на цикл
- d) 10000 петель, лучшее из 5: 25,4 мксек на петлю
- e) 5000 петель, лучшее из 5: 44,7 усек за петлю
- f) 500000 циклов, лучшее из 5: 522 нсек на цикл
Вход 2, с повторениями:
'a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*****************************************************************************************************a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*'
- а) 5000 циклов, лучшее из 5: 46,2, т. Е. На цикл
- b) 50000 петель, лучшее из 5: 5,21 мксек на петлю
- в) 20000 циклов, лучшее из 5: 13,4 мксек на цикл
- d) 5000 петель, лучшее из 5: 47,4 на одну петлю
- e) 2000 петель, лучшее из 5: 103 мксек на петлю
- f) 20000 циклов, лучшее из 5: 13,1, т. Е. На цикл
![b() is best overall, c() best if no matches](https://i.stack.imgur.com/rPKeT.png)
Методы:
#!/usr/bin/env python
# encoding: utf-8
"""
See which function variants are fastest. Run like:
python -mtimeit -s"import time_functions;t='a*'*100" "time_functions.a(t)"
python -mtimeit -s"import time_functions;t='a*'*100" "time_functions.b(t)"
etc.
"""
import re
def a(text):
return re.sub(r"\*+", "*", text)
def b(text):
re.sub(r"\*\*+", "*", text)
# aka squeeze()
def c(text):
while "*" * 2 in text:
text = text.replace("*" * 2, "*")
return text
regex = re.compile(r"\*+")
# like a() but with (premature) optimisation
def d(text):
return re.sub(regex, "*", text)
def e(text):
return "".join(c for c, n in zip(text, text[1:] + " ") if c + n != "**")
def f(text):
while True:
if "**" in text: # if two stars are in the variable pattern
text = text.replace("**", "*") # replace two stars with one
else: # otherwise
break # break from the infinite while loop
return text