1

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

"   a     bc    "

应该成为

" a bc "

我有

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

但我希望更快。我看到的建议(并且不起作用)是

' '.join(text.split())

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

4

3 回答 3

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循环可能已经杀死了上述方法的所有理论性能。

于 2013-06-13T15:21:40.130 回答
2

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
于 2013-06-13T15:24:40.580 回答
0

只是对上面的建议进行了一个小的重写,但仅仅因为某些东西有一个小错误并不意味着你应该假设它不起作用。

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

front_space = lambda x:x[0]==" "
trailing_space = lambda x:x[-1]==" "
" "*front_space(text)+' '.join(text.split())+" "*trailing_space(text)
于 2013-06-13T15:22:11.147 回答