PyPy vs.CPython 3.8-差异在;“迭代次数”;用相同的代码?

PyPy vs.CPython 3.8-差异在;“迭代次数”;用相同的代码?,python,algorithm,loops,sudoku,pypy,Python,Algorithm,Loops,Sudoku,Pypy,我在修补用Python编写的数独求解算法时,偶然发现了一个有趣的现象 我正在计算回溯算法中的迭代次数,并将数字保存在日志文件中。(该算法似乎是完全确定的,因此我对获得相同输出的迭代次数的突然增加很感兴趣。) 现在有趣的部分是: 当我尝试使用PyPy(3.7-v7.3.3-win32)而不是Python 3.8(64位)运行相同的代码时,使用PyPy运行的迭代次数大约翻了一番,从使用CPython运行的362073次增加到629505次。 我的问题是:有人知道迭代次数的差异是什么吗 日志: 对于另

我在修补用Python编写的数独求解算法时,偶然发现了一个有趣的现象

我正在计算回溯算法中的迭代次数,并将数字保存在日志文件中。(该算法似乎是完全确定的,因此我对获得相同输出的迭代次数的突然增加很感兴趣。)

现在有趣的部分是:

当我尝试使用PyPy(3.7-v7.3.3-win32)而不是Python 3.8(64位)运行相同的代码时,使用PyPy运行的迭代次数大约翻了一番,从使用CPython运行的362073次增加到629505次。

我的问题是:有人知道迭代次数的差异是什么吗

日志:

对于另一个数独文件,差异很小,但可以忽略不计:

Iterations: 19443164, Time Taken: 106.15500068664551, File: test_0.csv -- Python 3.8
Iterations: 19443259, Time Taken: 13.188998937606812, File: ./sudokus/test_0.csv  -- PyPy 3.7
Iterations: 19443259, Time Taken: 13.118957042694092, File: ./sudokus/test_0.csv  -- PyPy 3.7
我的代码是:

我想您在第117行枚举了多个集合。此顺序在CPython中未指定,即任意。在PyPy中,您可以获得在集合中放置项目的顺序。

我已经在两个并发调试会话中逐步介绍了您的代码,每个解释器一个。
self.mask
中的
set
s在两个口译员之间看起来不一样-它们包含相同的值,但顺序不同。即使在第二次递归
solve
(当
self.iterations
变为
2
)时,执行流也会因为这种差异而发生分歧。我不知道这是否是您看到的差异的确切原因,但我猜这与
set
s在一个实现中保证了插入顺序有关,而不是在另一个实现中。

代码需要直接发布在这里,理想情况下,简化为a,显示了一个重现问题的狭窄示例。代码出现在问题中,而不是外部链接中。谢谢,这是有意义的。在这种情况下,如果一个解释器中的顺序是准随机的,那么我不应该看到每次运行时迭代次数的一些变化吗?(这里两个解释器都与迭代次数一致,只是它们之间的数字不同。)@kasztp当一个实现说它不能保证集合的插入顺序时,这就是它的全部意思。这并不意味着集合中的项目将随机排序。它们将以某种任意但确定性的方式排序。不一定按插入顺序,也不一定按标准规定的方式。一个实现可以随意建立一个集合的顺序。谢谢,这澄清了它!
Iterations: 19443164, Time Taken: 106.15500068664551, File: test_0.csv -- Python 3.8
Iterations: 19443259, Time Taken: 13.188998937606812, File: ./sudokus/test_0.csv  -- PyPy 3.7
Iterations: 19443259, Time Taken: 13.118957042694092, File: ./sudokus/test_0.csv  -- PyPy 3.7