Verimlilik açısından bakıldığında,
s.translate(None, string.punctuation)
Python'un daha yüksek sürümleri için aşağıdaki kodu kullanın:
s.translate(str.maketrans('', '', string.punctuation))
Bir arama tablosu ile C'de ham dize işlemleri gerçekleştiriyor - bunu yenecek çok şey yok ama kendi C kodunuzu yazıyor.
Hız endişe etmiyorsa, başka bir seçenek:
exclude = set(string.punctuation)
s = ''.join(ch for ch in s if ch not in exclude)
Bu, her karakterle s.replace'den daha hızlıdır, ancak aşağıdaki zamanlamalardan görebileceğiniz gibi regexes veya string.translate gibi saf olmayan python yaklaşımları kadar iyi performans göstermez. Bu tür bir sorun için, bunu mümkün olduğunca düşük bir seviyede yapmak işe yarar.
Zamanlama kodu:
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)
Bu, aşağıdaki sonuçları verir:
sets : 19.8566138744
regex : 6.86155414581
translate : 2.12455511093
replace : 28.4436721802