我正在为我正在处理的 python cgi 艺术项目进行非常大的数学计算。 python 代码运行数天加载数据库信息,然后迭代地进行数千次浮点乘法和除法。它产生不同的输出,没有随机函数或其他变化的输入。我正在使用熊猫数据库。 CPU 错误或其他问题是否有可能造成如此大规模的数学输出差异?我检查了很多次,不明白为什么每次运行时相同的逻辑数学和输入不会产生相同的结果。浮点数学能否产生不同的结果? cpus 会产生数学错误或方差吗?
简答: 是的,理论上可能。
真正的答案:但这几乎肯定不是这里发生的事情(即使对于巨大的数据集,在任何给定运行中出现此类问题的几率都是tiny,所以如果你运行了三次并且每次输出都不同,要么它不是宇宙射线位翻转,要么你的概率是步行休息并且绝对应该去玩彩票)。你有一个错误,或者你引入了你不知道的随机性或变化的输入数据。
例如,即使不调用随机函数,现代 Python 也会引入一些随机性,特别是 可以散列为一系列字节的事物的散列行为(
bytes
本身,str
,datetime.datetime
等.)。虽然 dict
s 自 3.7(3.6 作为实现细节)以来一直是插入排序的,但 set
s 仍然是任意排序的,并且对于使用种子哈希方案的任何类型,排序将随着运行而改变。如果您的代码假设 set
s 具有可重现的、有意义的顺序,并以某种方式依赖于它,那么即使您的代码和输入的每个其他方面都是确定性的,您的运行实际上也可能会发生变化。
浮点数学也是顺序敏感的;虽然纯确定性代码应该以相同的顺序执行浮点数学运算,但低级高性能库可能会处理大量工作,从而引入非确定性。当然,如果前面提到的
set
s 参与进来,并且它们的顺序决定了浮点数学的顺序(float
本身不使用种子哈希,但种子哈希类型可能会影响 float
操作顺序取决于关于你在做什么),这将得到一些可靠的非确定性。
当然,如果代码和你正在做的一样大,你可能正在使用线程来加速,如果你有任何形式的比赛,这会导致类似的问题。