结合我的评论和@khelwood的评论:
TL;博士:
在分析字节码进行这两种比较时,它揭示了
'time'
和
“时间”
字符串被指定给同一个对象。因此
身份检查
(C级)是比较速度提高的原因。
相同对象赋值的原因是
实施细节
,CPython实习生字符串,仅包含“名称字符”(即alpha和下划线字符)。这将启用对象的身份检查。
字节码:
import dis
In [24]: dis.dis("'time'=='time'")
1 0 LOAD_CONST 0 ('time') # <-- same object (0)
2 LOAD_CONST 0 ('time') # <-- same object (0)
4 COMPARE_OP 2 (==)
6 RETURN_VALUE
In [25]: dis.dis("'time'=='1234'")
1 0 LOAD_CONST 0 ('time') # <-- different object (0)
2 LOAD_CONST 1 ('1234') # <-- different object (1)
4 COMPARE_OP 2 (==)
6 RETURN_VALUE
分配时间:
“加速”也可以在时间测试中使用赋值中看到。将两个变量赋值(和比较)到同一个字符串,比将两个变量赋值(和比较)到不同的字符串要快。进一步支持这一假设,其基本逻辑是执行对象比较。这将在下一节中得到证实。
In [26]: timeit.timeit("x='time'; y='time'; x==y", number=1000000)
Out[26]: 0.0745926329982467
In [27]: timeit.timeit("x='time'; y='1234'; x==y", number=1000000)
Out[27]: 0.10328884399496019
Python源代码:
正如@mkrieger1和@masklin在他们的评论中所提供的帮助
source code
对于
unicodeobject.c
首先执行指针比较,如果
True
,立即返回。
int
_PyUnicode_Equal(PyObject *str1, PyObject *str2)
{
assert(PyUnicode_CheckExact(str1));
assert(PyUnicode_CheckExact(str2));
if (str1 == str2) { // <-- Here
return 1;
}
if (PyUnicode_READY(str1) || PyUnicode_READY(str2)) {
return -1;
}
return unicode_compare_eq(str1, str2);
}
附录: