2013-11-14 5 views
1

Быстрее проверить, существует ли подстрока (в моем случае пробел) в строке перед ее удалением или для использования во всем мире relace();Быстрее проверить, существует ли какая-либо подструктура перед ее удалением?

использования:

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

Любые другие предложения приветствуются, тоже.

+0

Вы измерили? –

+0

Я этого не делал. Я подумал, что кто-то может ответить из опыта? – LarsVegas

+2

мой опыт: 1) простая программа - лучшая программа. 2) если вы хотите * знать *, если ваша программа будет быстрее в разных условиях, единственный способ - это время вашего конкретного кода – Vorsprung

ответ

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 

Использование 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 

Примечание не мог время str.translate, потому что str.translate в Python 3 не принимает deletechars параметр.

2

Если вы говорите об удалении только пробелов, вы можете использовать translate.

a = ['452 04','45204','455 04','88804'] 
a = [item.translate(None, " ") for item in a] 
print a 
+0

@falsetru Извините. Исправлено. – thefourtheye

Смежные вопросы