为什么 set subtraction 和 .difference() 以不同的速度运行

问题描述 投票:0回答:1

要找到两个集合之间的差异,可以使用

-
运算符和
.difference()
运算符。我正在使用这段代码对每一个进行计时:

import timeit

print(timeit.timeit('''
a.difference({b})
                    ''', setup='''
a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
b = 3
                    '''))
# => 0.2423834060318768

print(timeit.timeit('''
a - {b}
                    ''', setup='''
a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
b = 3
                    '''))
# => 0.2027170000365004

当我在 CPython 中运行它时,我得到这个:

0.24530324200168252
0.205820870003663

这对我来说很有意义,因为

.difference()
可以接受任何可迭代对象,而不仅仅是集合。然而,当我在 PyPy 中运行它时,我得到了这个:

0.14613953093066812
0.23659668595064431

时代完全颠倒了,所以肯定不可能,因为

.difference()
可以接受任何可交互的。
.difference()
-
的实现有什么区别? CPython 和 PyPy 的实现有什么区别吗?

python set cpython pypy timeit
1个回答
0
投票

我从源头上阅读,这里是猜测还没有证明)

PyPy 是 Python 的另一种实现,它使用即时 (JIT) 编译器来加速代码执行。 JIT 编译器可以通过将频繁执行的代码路径编译为机器代码来在运行时优化代码。与使用字节码解释器的标准 CPython 解释器相比,这可以显着提高性能。

在设置差异方法的情况下,由于 JIT 编译器,PyPy 可能比 CPython 更有效地优化方法的执行。 PyPy 可能能够识别和优化 difference 方法中频繁执行的代码路径,从而加快执行时间。 PyPy 对集合类型的实现也可能与 CPython 的实现不同,这也可能导致性能差异。

只是我的$.02 ---- 只是为了我们集思广益。

© www.soinside.com 2019 - 2024. All rights reserved.