由于len(trailing)无论如何都必须得到(如果trailing要删除的字符串,要删除的字符串在哪里),我建议避免.endswith这种情况下可能引起的工作重复。当然,代码的证明是在时间上,因此,让我们做一些测量(在受访者提出功能后命名它们):
import re
astring = 'this is some string rec'
trailing = ' rec'
def andrew(astring=astring, trailing=trailing):
regex = r'(.*)%s$' % re.escape(trailing)
return re.sub(regex, r'\1', astring)
def jack0(astring=astring, trailing=trailing):
if astring.endswith(trailing):
return astring[:-len(trailing)]
return astring
def jack1(astring=astring, trailing=trailing):
regex = r'%s$' % re.escape(trailing)
return re.sub(regex, '', astring)
def alex(astring=astring, trailing=trailing):
thelen = len(trailing)
if astring[-thelen:] == trailing:
return astring[:-thelen]
return astring
假设我们已经命名了这个python文件a.py,它在当前目录中;现在,...:
$ python2.6 -mtimeit -s'import a' 'a.andrew()'
100000 loops, best of 3: 19 usec per loop
$ python2.6 -mtimeit -s'import a' 'a.jack0()'
1000000 loops, best of 3: 0.564 usec per loop
$ python2.6 -mtimeit -s'import a' 'a.jack1()'
100000 loops, best of 3: 9.83 usec per loop
$ python2.6 -mtimeit -s'import a' 'a.alex()'
1000000 loops, best of 3: 0.479 usec per loop
如您所见,基于RE的解决方案被“绝望地淘汰了”(当一个“过度杀伤”一个问题时经常发生-这可能是RE在Python社区中表现不佳的原因之一!),尽管@Jack的评论比@Andrew的原始评论好得多。正如预期的那样,基于字符串的解决方案endswith令人生畏,我的-避免方案比@Jack的解决方案具有微不足道的优势(仅提高了15%)。因此,这两种纯字符串的想法都是好的(以及简洁明了的想法)-我更喜欢我的变体,仅是因为我是一个节俭的人(有人可能会说小气;-)。 。 “浪费不可”!-)