谁能帮我优化这三个功能?我对最初的python文件进行了分析和计时,发现大多数调用和持续时间都是因为这三个函数。
这三个函数来自文本规范化器,用于文本处理。如果有人想查看整个脚本,那么完整的python文件是可用的。谢谢
def __rstrip(self, token):
for i in range(5):
if len(token):
if token[-1] in [',', '.', ';', '!', '?', ':', '"']:
token = token[:-1]
else:
break
return token
def __lstrip(self, token):
for i in range(5):
if len(token):
if token[0] in [',', '.', ';', '!', '?', ':', '"', '\'']:
token = token[1:]
else:
break
return token
def __generate_results(self, original, normalised):
words = []
for t in normalised:
if len(t[0]):
words.append(t[0])
text = ' '.join(words)
tokens = []
if len(original):
for t in original:
idx = t[1]
words = []
for t2 in normalised:
if idx == t2[1]:
words.append(t2[0])
display_text = self.__rstrip(t[0])
display_text = self.__lstrip(display_text)
tokens.append((t[0], words, display_text))
else:
tokens.append(('', '', ''))
return text, tokens发布于 2020-09-11 23:39:08
下面是一些关于一般代码清理的建议。我不能保证这些改变都能提高性能。
if len(xxx):
几乎可以肯定的是,您可以用if xxx:替换它们。它不能保证是相同的,但是几乎所有支持len的类型都会测试false,如果它们的长度为0。这包括字符串、列表、dicts和其他标准Python类型。
我会把__rstrip和__lstrip变成顶级函数,或者至少让他们成为@staticmethods,因为他们不使用self。__generate_results也可能是一种静态方法。
__rstrip和__lstrip似乎重新实现了内置str.rstrip和str.lstrip的功能。可能,你可以用
display_text = t[0].rstrip(',.;!?:"')
display_text = display_text.lstrip(',.;!?:"\'')如果对最多5个字符进行剥离真的很重要,那么您可以这样做:
def _rstrip(token):
return token[:-5] + token[-5:].rstrip(',.;!?:"')
def _lstrip(token):
return token[:5].lstrip(',.;!?:"\'') + token[5:]令牌-1( “、”、“!”、“?”、“” )
无论是token[-1] in {',', '.', ';', '!', '?', ':', '"'}还是token[-1] in ',.;!?:"'都会更快。后者的风险更大,因为它不是完全相同的:如果token[-1]不是单个字符,它将执行子字符串测试。但是如果token是一个字符串,那么token[-1]就保证是一个单独的字符。
词条= []表示t: if len(t0):words.append(t0)
您可以用words = [t[0] for t in normalised if t[0]]替换它。
t2 = []表示标准化: if idx == t21:words.append(t20)
这可能是效率低下的一个重要原因。您可以尝试在循环之外创建一个查找表:
normalized_lookup = collections.defaultdict(list)
for t in normalized:
normalized_lookup[t[1]].append(t[0])然后将引用的代码替换为words = normalized_lookup[idx]。不过,这样做的速度可能会慢一些。另外,它的副作用是,idx的相同值的列表将被共享,这可能会导致微妙的,难以捕捉的混叠错误。如果这是一个问题,请编写words = list(normalized_lookup[idx]) (或tuple)。
https://codereview.stackexchange.com/questions/249237
复制相似问题