【发布时间】:2022-03-30 19:58:45
【问题描述】:
这里有两个测量:
timeit.timeit(\"toto\"==\"1234\"\', number=100000000)
1.8320042459999968
timeit.timeit(\"toto\"==\"toto\"\', number=100000000)
1.4517491540000265
如您所见,比较两个匹配的字符串比比较两个大小相同但不匹配的字符串要快。
这很令人不安:在字符串比较期间,我认为 Python 正在逐个字符地测试字符串,因此 \"toto\"==\"toto\" 的测试时间应该比 \"toto\"==\"1234\" 长,因为它需要针对不匹配比较进行四次测试。也许比较是基于哈希的,但在这种情况下,两个比较的时间应该相同。
为什么?
-
字符串实习可能吗?
-
检查
\"toto\" is \"toto\"的值。很可能同一语句中的两个相同字符串文字被编译为同一个字符串对象。我想如果你的琴弦是用不同的方式制作的,你会得到不同的结果。 -
@RiccardoBucco \"small integers\"(从 -5 到 255 IIRC)实际上是预先记忆的,它们总是会从缓存中获取。所以对他们进行身份检查也很有意义。
-
@RiccardoBucco 是的,但是您具有相同身份的原因是缓存了小整数(在cpython中,作为实现细节)。浮点数没有这样的缓存,因此相同文字的两个实例是不同的对象。并且因为遇到相同的浮点数(相同的对象,不同的值)的可能性很低(因为它们没有被缓存)cpython 不会优化这种比较。
-
\"在字符串比较期间,我认为 python 正在逐个字符地测试字符串\"- 我真诚地怀疑任何体面的编程语言都使用天真的 for 循环进行字符串比较。 Python 肯定不会,it uses memcmp,其中may use SIMD instructions to compare many bytes at a time,以及其他优化。
标签: python performance comparison