Do ponto de vista da eficiência, você não vai vencer
s.translate(None, string.punctuation)
Para versões superiores do Python, use o seguinte código:
s.translate(str.maketrans('', '', string.punctuation))
Ele está executando operações de cadeia bruta em C com uma tabela de pesquisa - não há muito que supere isso, mas escrevendo seu próprio código C.
Se a velocidade não é uma preocupação, outra opção é:
exclude = set(string.punctuation)
s = ''.join(ch for ch in s if ch not in exclude)
Isso é mais rápido que o s.replace com cada caractere, mas não terá um desempenho tão bom quanto as abordagens python não puras, como regexes ou string.translate, como você pode ver nos intervalos abaixo. Para esse tipo de problema, fazê-lo no nível mais baixo possível compensa.
Código de tempo:
import re, string, timeit
s = "string. With. Punctuation"
exclude = set(string.punctuation)
table = string.maketrans("","")
regex = re.compile('[%s]' % re.escape(string.punctuation))
def test_set(s):
return ''.join(ch for ch in s if ch not in exclude)
def test_re(s): # From Vinko's solution, with fix.
return regex.sub('', s)
def test_trans(s):
return s.translate(table, string.punctuation)
def test_repl(s): # From S.Lott's solution
for c in string.punctuation:
s=s.replace(c,"")
return s
print "sets :",timeit.Timer('f(s)', 'from __main__ import s,test_set as f').timeit(1000000)
print "regex :",timeit.Timer('f(s)', 'from __main__ import s,test_re as f').timeit(1000000)
print "translate :",timeit.Timer('f(s)', 'from __main__ import s,test_trans as f').timeit(1000000)
print "replace :",timeit.Timer('f(s)', 'from __main__ import s,test_repl as f').timeit(1000000)
Isso fornece os seguintes resultados:
sets : 19.8566138744
regex : 6.86155414581
translate : 2.12455511093
replace : 28.4436721802