在Python中比较性能:相等与不相等

5 投票
3 回答
3546 浏览
提问于 2025-04-18 09:36

在比较任何变量时,我们可以选择比较它们是否相等,或者比较它们是否不相等。对于只有一个元素的变量,比如说不是字符串、列表、元组等,二者之间的区别可能几乎不存在,或者说差别很小。

问题是:当我们比较两个包含多个元素的变量时,检查它们是否相等的速度是比检查它们是否不相等的速度要慢,还是快呢?

我直觉上觉得检查它们是否不相等应该会更快。我很好奇有没有人能告诉我这是否正确,以及对于哪些多元素类型是这样的。

注意:我查过了,没找到任何帖子能回答我的问题。可能这个问题很明显,但我想听听比我自己更多的看法。

3 个回答

-3

我对Cortex M3汇编语言的了解(至少我教授是这么说的)是,当你检查两个东西是否相等或者不相等时,有一个比较指令会设置三个标志位,然后有一个类似于if语句的东西会查看其中的一个。简单来说,你比较AB,这三个标志位分别表示“小于”、“等于”和“大于”。当你检查任何东西时,要么是检查它是大于还是小于(这需要两次检查,所以需要两个周期),要么是对等于的标志进行取反,这在不同的架构下可能是两个不同的操作,或者只需要一个周期。因此,我推测这取决于编译器、汇编器和CPU的架构。

这意味着你可以写两个程序,每个程序进行大量这样的检查,并测量它们的执行时间,这里的“大量”可以达到几万次(根据C/C++的执行时间来看)。在我看来,这个任务是相当可行的,你可以手动计时,这样就不用担心计时器的问题,因为在很多语言中,计时器的精度有些奇怪,可能无法准确捕捉单条语句的执行时间。或者你可以测量那些巨大的循环,看看计算机给出的结果。

不过要记住,如果你在不等于的循环中得到了1.1倍的时间,这并不意味着不等于的检查时间是等于检查时间的1.1倍,因为这个循环的周期要大得多,可能会是2倍的时间。通过更多的测试和每个循环中更多的检查,应该很容易确定循环所需的时间和检查所花费的时间。希望这些对你有帮助。

1

我觉得这和 object.__eq__()object.__ne__ 有直接关系。

这些方法在你使用 ==(相等)或者 !=(不相等)时会被调用。根据你想比较的对象,这些方法的执行速度可能会快也可能会慢,这取决于这些方法是怎么写的。

可以查看官方文档中的 数据模型基本定制

4

你可以随时检查一下:

>>> timeit("{'a': 1, 'b': 2} == {'a': 2, 'b': 1}")
0.29072967777517983
>>> timeit("{'a': 1, 'b': 2} != {'a': 2, 'b': 1}")
0.2906114293159803

看起来差别不大……再来一个测试案例怎么样?

>>> timeit("range(30) == range(35)")
0.7179841181163837
>>> timeit("range(30) != range(35)")
0.725536848004765

再说一次,差别也不大。

>>> timeit("a == b", "a = {'a': 1, 'b': 2}; b = {'a': 2, 'b': 1}")
0.06806470555693522
>>> timeit("a != b", "a = {'a': 1, 'b': 2}; b = {'a': 2, 'b': 1}")
0.06724365965146717

而且把对象创建的部分移出去。虽然这些都是小例子,但我想两者在明显不同的时候,都会使用短路运算。

撰写回答