<p>对一小段代码的单次执行计时并不能告诉您很多信息。特别是,如果你看一下你的<code>test1</code>和<code>test3</code>中的计时数字,你会发现这些数字是相同的</em>。这应该是一个警告信号,事实上,你在这里看到的只是计时器的分辨率:</p>
<pre><code>>>> 2.0 / 2 ** 20
1.9073486328125e-06
>>> 1.0 / 2 ** 20
9.5367431640625e-07
</code></pre>
<p>为了获得更好的结果,您需要多次运行代码,并测量并减去计时开销。Python有一个内置的模块<a href="http://docs.python.org/2/library/timeit.html" rel="noreferrer">^{<cd3>}</a>来完成这项工作。让我们来计算每种比较的1亿次执行时间:</p>
^{pr2}$
<p>因此,您可以看到差异并不是很大(在本例中,字符串比较只慢了大约25%)。那么为什么字符串比较慢呢?好吧,找到答案的方法是看看比较操作的实现。在</p>
<p>在Python2.7中,比较是由<a href="http://hg.python.org/cpython/file/2a3884b6ffb5/Objects/object.c#l811" rel="noreferrer">^{<cd4>} function in ^{<cd5>}</a>实现的。(请在一个新窗口中打开这段代码,以继续我的其余分析。)在第817行,您将看到,如果被比较的对象是同一类型的,并且它们的类结构中有一个<code>tp_compare</code>函数,那么这个函数就被调用了。在整数对象的情况下,会发生这样的情况,函数是<a href="http://hg.python.org/cpython/file/2a3884b6ffb5/Objects/intobject.c#l438" rel="noreferrer">^{<cd7>} in ^{<cd8>}</a>,您将看到它非常简单。在</p>
<p>但是字符串没有<code>tp_compare</code>函数,因此<code>do_cmp</code>继续调用<a href="http://hg.python.org/cpython/file/2a3884b6ffb5/Objects/object.c#l668" rel="noreferrer">^{<cd11>}</a>,后者最多调用<a href="http://hg.python.org/cpython/file/2a3884b6ffb5/Objects/object.c#l641" rel="noreferrer">^{<cd12>}</a>(依次尝试三个比较运算符EQ、LT和GT)。这调用<a href="http://hg.python.org/cpython/file/2a3884b6ffb5/Objects/object.c#l606" rel="noreferrer">^{<cd13>}</a>,后者调用<a href="http://hg.python.org/cpython/file/2a3884b6ffb5/Objects/stringobject.c#l1186" rel="noreferrer">^{<cd14>} in ^{<cd15>}</a>。在</p>
<p>所以字符串比较比较慢,因为它必须使用复杂的“富比较”基础设施,而整数比较更直接。但即便如此,也没什么区别。在</p>