<p><code>re</code>似乎很快:</p>
<pre><code>import re
# to check whether any outside ranges (->MatchObject) / all in ranges (->None)
nonletter = re.compile('[^a-zA-Z]').search
# to check whether any in ranges (->MatchObject) / all outside ranges (->None)
letter = re.compile('[a-zA-Z]').search
bool(nonletter(myString1))
# True
bool(nonletter(myString2))
# True
bool(nonletter(myString2[:-1]))
# False
</code></pre>
<p>OP的两个例子和一个积极的例子的基准(set是@schwobaseggl setset是@DanielSanchez):</p>
^{pr2}$
<p>基准代码:</p>
<pre><code>import types
from timeit import timeit
import re
import string
import numpy as np
def mnsd(trials):
return '{:1.8f} \u00b1 {:10.8f} \u00b5s'.format(np.mean(trials), np.std(trials))
nonletter = re.compile('[^a-zA-Z]').search
letterset = set(string.ascii_letters)
def f_re(stri):
return not nonletter(stri)
def f_set(stri):
return all(x in letterset for x in stri)
def f_setset(stri):
return set(stri).issubset(letterset)
for stri in ('Австрия', 'AustriЯ', 'tralala'):
ref = f_re(stri)
print(stri)
for name, func in list(globals().items()):
if not name.startswith('f_') or not isinstance(func, types.FunctionType):
continue
try:
assert ref == func(stri)
print("{:16s}".format(name[2:]), mnsd([timeit(
'f(stri)', globals={'f':func, 'stri':stri}, number=1000) * 1000 for i in range(1000)]))
except:
print("{:16s} apparently failed".format(name[2:]))
</code></pre>