Python以最快的方式删除字符串中的多个空格

时间:2013-06-13 15:11:36

标签: python regex

之前已经问过这个问题,但我看到的快速答案也删除了我不想要的尾随空格。

"   a     bc    "

应该成为

" a bc "

我有

text = re.sub(' +', " ", text)

但我希望能有更快的东西。我见过的建议(哪些不起作用)是

' '.join(text.split())

请注意,我将对许多较小的文本执行此操作,因此只检查尾随空格不会太棒。

3 个答案:

答案 0 :(得分:2)

如果你想真正优化这样的东西,请使用C,而不是python。

尝试cython,这几乎是Python语法,但很快就像C。

以下是您可以计算的一些内容:

import array
buf=array.array('c')
input="   a     bc    "
space=False
for c in input:
  if not space or not c == ' ': buf.append(c)
  space = (c == ' ')
buf.tostring()

还可以尝试使用cStringIO

import cStringIO
buf=cStringIO.StringIO()
input="   a     bc    "
space=False
for c in input:
  if not space or not c == ' ': buf.write(c)
  space = (c == ' ')
buf.getvalue()

但是,如果你想让这些东西真的很快,不要在python中这样做。使用cython。我在这里给出的两种方法可能会变慢,只是因为他们在python解释器上做了更多的工作。如果你想要快速完成这些事情,请在python中尽可能少地 for c in input循环可能已经杀死了上述方法的所有理论性能。

答案 1 :(得分:1)

FWIW,一些时间

$  python -m timeit -s 's="   a     bc    "' 't=s[:]' "while '  ' in t: t=t.replace('  ', ' ')"
1000000 loops, best of 3: 1.05 usec per loop

$ python -m timeit -s 'import re;s="   a     bc    "'  "re.sub(' +', ' ', s)"
100000 loops, best of 3: 2.27 usec per loop

$ python -m timeit -s 's=" a bc "' "''.join((s[0],' '.join(s[1:-1].split()),s[-1]))"
1000000 loops, best of 3: 0.592 usec per loop

$ python -m timeit -s 'import re;s="   a     bc    "'  "re.sub(' {2,}', ' ', s)"
100000 loops, best of 3: 2.34 usec per loop

$ python -m timeit -s 's="   a     bc    "' '" "+" ".join(s.split())+" "'
1000000 loops, best of 3: 0.387 usec per loop

答案 2 :(得分:0)

只是对那里的建议进行了一次小的改写,但仅仅是因为某些事情有一个小错误并不意味着你应该认为它不起作用。

您可以轻松地执行以下操作:

front_space = lambda x:x[0]==" "
trailing_space = lambda x:x[-1]==" "
" "*front_space(text)+' '.join(text.split())+" "*trailing_space(text)