使python循环更快

时间:2018-05-08 13:40:34

标签: python python-2.7 performance for-loop

这个小程序可以加快速度吗?有了elif,它让理解变得无法控制,但也许我没有以正确的方式尝试过。

def cleanup(s):
    strng = ''
    good = ['\t', '\r', '\n']
    for char in s:        
        if unicodedata.category(char)[0]!="C":
            strng += char
        elif char in good:
            strng += char
        elif char not in good:
            strng += ' '
    return strng

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的任务,您希望将所有 unicode控制字符替换为空格 \t\n和{{1}除外}}

以下是使用正则表达式而不是循环来更有效地执行此操作的方法。

\r

您可以通过操纵构成import re # make a string of all unicode control characters # EXCEPT \t - chr(9), \n - chr(10) and \r - chr(13) control_chars = ''.join(map(unichr, range(0,9) + \ range(11,13) + \ range(14,32) + \ range(127,160))) # build your regular expression cc_regex = re.compile('[%s]' % re.escape(control_chars)) def cleanup(s): # substitute all control characters in the regex # with spaces and return the new string return cc_regex.sub(' ', s) 变量的范围来控制要包含或排除的字符。请参阅List of Unicode characters

编辑计时结果。

出于好奇,我进行了一些计时测试,看看当前三种方法中哪一种最快。

我制作了三个名为control_chars的方法,它是OP代码的副本; cleanup_op(s)这是Cristian Ciupitu的答案; cleanup_loop(s)这是我的代码。

这是我跑的:

cleanup_regex(s)

结果:

cleanup_op在 1.1秒

中完成

cleanup_loop在 0.02秒

中完成

cleanup_regex以 0.004秒

结束

因此,其中一个答案是对原始代码的重大改进。我认为@CristianCiupitu给出了一个更优雅和pythonic的答案,而正则表达式仍然更快。

答案 1 :(得分:0)

如果我理解正确,您希望将所有Unicode控制字符转换为空格,除了选项卡回车新行。您可以使用str.translate

good = map(ord, '\t\r\n')
TBL_CONTROL_TO_SPACE = {
    i: u' '
    for i in xrange(sys.maxunicode)
    if unicodedata.category(unichr(i))[0] == "C" and i not in good
}

def cleanup(s):
    return s.translate(TBL_CONTROL_TO_SPACE)