Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较Python中的性能:相等与不相等_Python_Performance_Comparison_Equals - Fatal编程技术网

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

比较Python中的性能:相等与不相等,python,performance,comparison,equals,Python,Performance,Comparison,Equals,在比较任何变量时,都可以选择比较相等还是比较不相等。对于只有一个元素的变量,而不是字符串/列表/元组/等等,差异可能不存在或可以忽略不计 问题: 在比较两个多元变量时,检查它们是否相等比比较它们是否相等慢还是快 我的直觉告诉我比较它们是否相等应该更快。我很好奇是否有人能告诉我这是不是真的,对于哪种类型的多元素类型,这是真的 注意:我已经看过了,在这里没有找到任何回答我问题的帖子。这可能是显而易见的,但我希望有更多的意见,而不仅仅是我自己的意见。你可以随时检查: >>> time

在比较任何变量时,都可以选择比较相等还是比较不相等。对于只有一个元素的变量,而不是字符串/列表/元组/等等,差异可能不存在或可以忽略不计

问题: 在比较两个多元变量时,检查它们是否相等比比较它们是否相等慢还是快

我的直觉告诉我比较它们是否相等应该更快。我很好奇是否有人能告诉我这是不是真的,对于哪种类型的多元素类型,这是真的


注意:我已经看过了,在这里没有找到任何回答我问题的帖子。这可能是显而易见的,但我希望有更多的意见,而不仅仅是我自己的意见。

你可以随时检查:

>>> 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

随着对象创建的移出。诚然,这是一个很小的例子,但我仍然认为,当它们明显不同时,它们都会在适当的地方使用短路。

我认为这与
对象直接相关。
对象

当您使用
==
(相等)或
时,将启动此方法=(非相等)并且在要比较的对象的函数中,它可能更快或更慢,这取决于方法的编写方式


参见官方文件。

我对某些Cortex M3汇编的经验(或者至少我的教授说是这样的),当你检查相等或不相等时,有一个比较命令设置3位,还有一个if语句(如果你可以这样称呼它),它查看特定的一位。本质上,比较
A
B
,3位更小、相等和更大,然后当检查任何内容时,应检查其是否更大或更小(2次检查,因此2个周期)是否不相等,或对相等标志应用一个NOT,这取决于架构,可能是2个不同的动作或单个循环。因此,我推测它取决于编译器、汇编程序和CPU的体系结构

但是,这意味着您可以创建两个程序,每个程序都进行大量的此类检查,并对其执行时间进行计时,其中执行时间将达到数万次(根据C/C++中的执行时间判断)。在我看来,这是一项相当可行的任务,可以手动计时,这样就不会弄乱计时器,而且计时器在许多语言中的精度都有一些特点,它们甚至可能无法捕捉到单个语句的执行时间。或者你可以给巨大的循环计时,看看电脑会说些什么


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

专门用于将多元素变量与其他多元素变量进行比较。您可以尝试分析。什么是“多元素变量”?@IsmailBadawi我会,并会发布结果。但我在这里问这个问题的第二个原因,除了得到答案之外,是为了找出是否有任何(联合国)官方文件或研究针对这个主题。理论上,我认为你的直觉是错误的。他们可能假设要检查相等性,你必须检查每一项,而要检查差异,你可以停在任何不同的项上。但若你们看一个具体的例子,你们会发现对于一个给定的值,你们必须检查每个元素,直到你们找到一个不同的元素。另一方面,事实是,断言两个不同的元素不同比断言两个相等的元素相等要快。但这与方法无关,我认为值得一读,因为在他比较的类上实现这些函数可能会产生显著的影响。这最终归结起来就是,但是我想我应该开始交换,创建一组想法和测试来解释差异(如果有的话),而不是自己费力地阅读代码。。。我感谢你指出这一点,无论如何,这给了一个地方,开始寻找人们谁是想知道同样的事情!我正在创建一个包含更长列表的测试,以增加差异。将dicts与长度2进行比较并没有什么区别。谢谢这个测试包括对象构建时间,将该部分移动到setup=并重新测试会很有趣。Good poing@tdelaney,并包含在输出中。我得到的结果似乎表明列表和dict之间没有真正的区别。尽管我怀疑这可能是因为我生成的列表过于随机。我应该在“现实世界清单”上查一下@g、 d.d.c不知道timeit()是如何工作的,我选择创建两个dict并在一个可调用函数中对它们进行比较。这是一个非常有趣的讨论,但不幸的是,它与Python中的(非)相等性测试关系不大。这两个测试都转换为对自由形式方法的调用,该方法可以做任何事情,并且几乎总是做的远远不止是进行单个硬件级别的整数比较。我在回答中确实指出,这主要涉及到解释器、编译器、汇编程序,以及代码和执行之间的任何事情,我希望能够提供一些更深入的见解,我希望/相信我提供的循环和计时解决方案足够高,可以在计算中包含所有中间因素,从而避免我们思考如何实现该过程的复杂性。@user3079666感谢您的贡献!认识到工作中有更多的事情,而不仅仅是Python是P