在删除子字符串之前检查子字符串是否更快?

Lar*_*gas 1 python replace

检查字符串中是否存在子字符串(在我的情况下是一个空格)是否更快,然后才能删除它,或者在relace()全局使用时作为一种说法;

使用案例:

a = ['452 04','45204','455 04','88804']
for i,e in enumerate(a):
    if re.search(r"\s", e):
       a[i] = e.replace(' ','')
Run Code Online (Sandbox Code Playgroud)

欢迎任何其他建议.

fal*_*tru 10

import re

def with_re_search():
    a = ['452 04','45204','455 04','88804']
    for i,e in enumerate(a):
        if re.search(r"\s", e):
            a[i] = e.replace(' ','')

def with_in():
    a = ['452 04','45204','455 04','88804']
    for i,e in enumerate(a):
        if ' ' in e:
            a[i] = e.replace(' ','')

def without_search():
    a = ['452 04','45204','455 04','88804']
    for i,e in enumerate(a):
        a[i] = e.replace(' ','')

def with_translate():
    a = ['452 04','45204','455 04','88804']
    for i, e in enumerate(a):
        a[i] = e.translate(None,'')

from timeit import timeit as t
n = 1000000
t('f()', setup='from __main__ import with_re_search as f', number=n) # 5.37417006493
t('f()', setup='from __main__ import with_in as f',        number=n) # 1.04646992683
t('f()', setup='from __main__ import without_search as f', number=n) # 1.2475438118
t('f()', setup='from __main__ import with_translate as f', number=n) # 1.56214690208
Run Code Online (Sandbox Code Playgroud)

使用re.search绝对比其他选项慢.

这是在CPython 2.7.3,Ubuntu Linux 12.10 64bit中完成的.

更新:在CPython 3.3.0(同一台机器).

t('f()', setup='from __main__ import with_re_search as f', number=n) # 24.345079875027295
t('f()', setup='from __main__ import with_in as f',        number=n) # 1.1399168980424292
t('f()', setup='from __main__ import without_search as f', number=n) # 1.3967725560069084   
Run Code Online (Sandbox Code Playgroud)

注意无法计时str.translate,因为str.translate在Python 3中不接受deletechars参数.