【问题标题】:How do I force python to be reproducible? [duplicate]如何强制 python 可重现? [复制]
【发布时间】:2019-10-17 10:56:08
【问题描述】:

我在调试 python 代码时惊讶地发现它并不总是产生相同的输出。具体来说,有时我会从集合中选择一个随机元素,方法是把它变成一个列表并获取第一个元素,但我并不总是得到相同的元素。

这段代码说明了这种行为。

class Foo():
    def __init__(self,n):
        self.n = n
}
    def __repr__(self):
        return "<{}>".format(self.n)

print(list(set(Foo(i) for i in (1,2,3))))'''

It sometimes produces [<3>, <1>, <2>] and sometimes [<1>, <2>, <3>]

我曾尝试在执行前调用 random.seed(0) 但这没有效果

这无关紧要,但在我的实际问题中,我通过重复选择未处理的节点并从该节点进行泛洪填充,将图形分成连接的组件。我的代码选择随机节点来启动该过程,因此组件以不同的顺序计算,这使得调试代码更加困难,组件的工作和顺序可能会有所不同。

我知道我可以通过在选择列表中的第一个节点之前对节点列表进行排序来强制再现性,但这会带来不必要的开销。我是否天真地认为计算机语言的基本原则是它应该在相同的输入上始终表现相同?

【问题讨论】:

  • 套装不保证订单。 “不要用螺丝刀钉钉子”
  • @snakecharmerb:你甚至不需要任何特别的东西——你可以使用 OrderedDict 和一个虚拟值作为有序集合。
  • 谢谢卡尔,对我的问题最有用的答案是使用“PYTHONHASHSEED=0 python3 /tmp/foo.py”

标签: python debugging


【解决方案1】:

如果您使用random 模块,您可以通过调用具有特定值的函数randome.seed() 对其进行初始化,从而强制它始终生成相同的伪随机值序列。

我一般使用random.seed(42),但也可以使用其他值。

这很有用,因为它通常使测试更容易。

【讨论】:

    猜你喜欢
    • 2013-04-28
    • 2020-04-19
    • 2020-08-09
    • 1970-01-01
    • 2019-08-29
    • 2021-11-15
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    相关资源
    最近更新 更多