首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化python函数的速度

优化python函数的速度
EN

Code Review用户
提问于 2020-09-11 18:25:14
回答 1查看 70关注 0票数 -1

谁能帮我优化这三个功能?我对最初的python文件进行了分析和计时,发现大多数调用和持续时间都是因为这三个函数。

这三个函数来自文本规范化器,用于文本处理。如果有人想查看整个脚本,那么完整的python文件是可用的。谢谢

代码语言:javascript
复制
   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
EN

回答 1

Code Review用户

发布于 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.rstripstr.lstrip的功能。可能,你可以用

代码语言:javascript
复制
display_text = t[0].rstrip(',.;!?:"')
display_text = display_text.lstrip(',.;!?:"\'')

如果对最多5个字符进行剥离真的很重要,那么您可以这样做:

代码语言:javascript
复制
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)

这可能是效率低下的一个重要原因。您可以尝试在循环之外创建一个查找表:

代码语言:javascript
复制
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)。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/249237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档