<p>下面是一个基准测试,它表明使用<a href="http://docs.python.org/2/library/string.html?highlight=lower#string.lower" rel="nofollow noreferrer">^{<cd1>}</a>比接受答案建议的方法(<code>libc.strcasecmp</code>)更快:</p>
<pre><code>#!/usr/bin/env python2.7
import random
import timeit
from ctypes import *
libc = CDLL('libc.dylib') # change to 'libc.so.6' on linux
with open('/usr/share/dict/words', 'r') as wordlist:
words = wordlist.read().splitlines()
random.shuffle(words)
print '%i words in list' % len(words)
setup = 'from __main__ import words, libc; gc.enable()'
stmts = [
('simple sort', 'sorted(words)'),
('sort with key=str.lower', 'sorted(words, key=str.lower)'),
('sort with cmp=libc.strcasecmp', 'sorted(words, cmp=libc.strcasecmp)'),
]
for (comment, stmt) in stmts:
t = timeit.Timer(stmt=stmt, setup=setup)
print '%s: %.2f msec/pass' % (comment, (1000*t.timeit(10)/10))
</code></pre>
<p>我机器上的典型时间:</p>
<pre><code>235886 words in list
simple sort: 483.59 msec/pass
sort with key=str.lower: 1064.70 msec/pass
sort with cmp=libc.strcasecmp: 5487.86 msec/pass
</code></pre>
<p>因此,目前为止,<code>str.lower</code>的版本不仅是最快的,而且也是这里所有建议的解决方案中最可移植和最易懂的。
我没有描述内存使用情况,但原始海报仍然没有给出令人信服的理由来担心它。另外,谁说对libc模块的调用不会复制任何字符串?</p>
<p>注意:<code>lower()</code>字符串方法还具有依赖于区域设置的优点。在编写自己的“优化”解决方案时,您可能会遇到一些问题。即便如此,由于Python中的错误和缺少的特性,这种比较可能会在unicode上下文中给出错误的结果。</p>