我目前有一种方法需要优化!
我仍在学习python,因此非常感谢您的帮助!

我正在尝试对一个非常大的语料库运行下面的方法,并且我需要优化/减少该方法的运行时间,因为它已经花费了大约6秒钟的时间来执行。

要求:


检查单词仅包含字母,连字符和撇号
单词的第一个字符必须是字母
单词的最后一个字符只能是字母或撇号。
严格禁止使用re库(regex)


下面是代码:

def delUnknownChar(w):
    wf = []
    for c in w:
        if (c == "'" or c == "-" or c.isalpha()):
            wf.append(c)

    w = "".join(wf)
    wf.clear()

    if (len(w) > 1):
        while(not w[0].isalpha()):
            w = w[1:]

        while (w[-1] == "-"):
            w = w[:-1]

        return w
    else:
        return None

string1 = delUnknownChar("-'test'-")
print(string1)


输出将被测试'
上面的代码大约需要5秒钟才能运行。

如果我将代码的第2-7行更改为此行:

w = "".join(c for c in w if c == "'" or c == "-" or c.isalpha())


运行时间以某种方式又增加了1秒。

这里有没有人有更好的主意或改进的优化方法来以更快的速度进行检查?谢谢!

最佳答案

尝试str.translate

from string import punctuation,digits

def delUnknownChar(s):
    trans = """!"#$%&()*+,./:;<=>?@[\]^_`{|}~0123456789"""
    return s.translate(None,trans).lstrip("-'").rstrip("-")


Python 3:

trans = """!"#$%&()*+,./:;<=>?@[\]^_`{|}~0123456789"""
d = {k: "" for k in trans}
def delUnknownChar1(s):
    return s.translate(str.maketrans(d)).lstrip("-'").rstrip("-")


没有翻译:

def delUnknownChar1(s):
    good = set("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-'")
    clean = ""
    for ele in s:
        if ele in good:
            clean += ele
    return clean.lstrip("-'").rstrip("-")


静态str.maketrans(x [,y [,z]])

此静态方法返回可用于str.translate()的转换表。
如果只有一个参数,则它必须是将Unicode序号(整数)或字符(长度为1的字符串)映射到Unicode序号,任意长度的字符串或无的字典。然后,字符键将转换为普通字符。
如果有两个参数,则它们必须是长度相等的字符串,并且在结果字典中,x中的每个字符都将映射到y中相同位置的字符。如果有第三个参数,则必须是一个字符串,其字符将在结果中映射为None。

In [30]: timeit Filter(s)
100 loops, best of 3: 10.48 ms per loop

In [31]: timeit delUnknownChar(s) # yours
100 loops, best of 3: 8.41 ms per loop

In [32]: timeit delUnknownChar1(s) # mine
100 loops, best of 3: 2.46 ms per loop
In [25]: timeit delUnknownChar1(s)
100 loops, best of 3: 3.72 ms per loop

关于python - Python:需要建议来优化过滤器字符方法的运行时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26807762/

10-12 17:01
查看更多