python - 两个相同的 Python 文件在运行时表现不同的可能原因是什么?
问题描述
我正在运行一个迭代算法。我正在比较它的两个相同的实现,在两个不同的文件中,它们是彼此复制粘贴的版本,但在不同的子目录中。然而我总是得到不同的结果,一个文件(同一个文件)总是需要更少的步骤来收敛。您可以在此处查看每个文件的五次运行的比较:
蓝色的应该与绿色的相同(或至少反之亦然)。
- 两个文件中的代码:https ://gist.github.com/corazza/a945a6d7929341818e19261f568c4eb5#file-gistfile1-py
globals()
在两个文件的运行期间嵌入 IPython shell 时的输出差异: https ://www.diffchecker.com/i6TcIndO
正如您在globals()
差异中看到的那样,唯一的区别在于模块名称(因为它们是不同子目录中的不同文件),最后两个函数的完全限定名称也有所不同,但这些函数是什么文件由它们组成,并且它们是复制粘贴的,因此完全相同。命名空间中的其他函数和常量是相同的。
我完全不知道这种行为的可能原因是什么,有人有候选人吗?
解决方案
我已经设法解决了这个问题。主要原因是实际上有另一个脚本启动了两个主要(相同)文件。启动脚本悄悄地尝试从主要的两个文件各自的目录中加载第三个文件。该文件包含一些对传递给主文件中函数的参数的覆盖learn
,主要罪魁祸首是算法的学习率。如果找不到该特定文件,该脚本会静默失败,在这种情况下,该learn
函数会使用默认参数。一个文件的目录包含该文件,而另一个没有,因此即使它们相同,算法最终也会具有不同的学习率。因为这些是他们没有出现的论点globals()
,我不知道这种行为,但应该意识到这一点。
除此之外,RNG 播种也存在问题。我设置了种子,但仍然有完全不同的运行。这是由于序列化一个集合并将其传递给第三个程序进行处理,并通过将其转换为列表并在序列化之前对其进行排序来解决。
我将投票结束这个问题,因为这个问题太具体了。
推荐阅读
- mysql - 如何使用 MySQL 声明开始日期和结束日期
- r - 构建 R 包时如何向导出的数据添加列表?
- passport.js - 带 Gatsby 注销的 Passport-Local 未完全注销
- javascript - 是否可以在特征检测中包装 core-js polyfill?
- laravel - 我应该使用 FormRequest 的 prepareForValidation 来传递验证请求的参数吗?
- python - 我应该使用 if 语句还是循环?
- python - 将传单地图添加到 PyQt5
- c# - 如何翻转 MediaPlayer 视频
- javascript - 如何在卡片操作按钮组中使用对话框
- php - 自动加载转储后脚本因错误而终止