定义我自己的random.randbool是个好主意吗?

时间:2015-11-25 16:17:49

标签: python

Python没有<\/button> 函数,但它有random.randboolrandintrandrange。如果我想使用random函数,没有什么能阻止我使用以下代码:

randbool

建议这样做吗?它是pythonic&#39;?它慢得多吗?这绝对允许在以后的代码中易于理解,因为相反内联import random random.randbool = lambda: random.random() >= 0.5 random.random() >= 0.5可能会更加混乱。

当然,替代方案只是使用常规功能 -

random.choice([False, True])

哪个更好?

修改:部分def randbool(): return random.random() >= 0.5 基准:

timeit

因此,最快的是内联,然后是常规函数,然后定义> python -m timeit -s "import random" -s "def randbool():" -s " return random.random() >= 0.5" "randbool() 1000000 loops, best of 3: 0.275 usec per loop > python -m timeit -s "import random" "random.random() >= 0.5" 10000000 loops, best of 3: 0.152 usec per loop > python -m timeit -s "import random" -s "random.randbool = lambda: random.random() >= 0.5" "random.randbool()" 1000000 loops, best of 3: 0.322 usec per loop > python -m timeit -s "import random" "random.choice([False, True])" 100000 loops, best of 3: 2.03 usec per loop > python -m timeit -s "import random" "random.randint(0, 1)" 100000 loops, best of 3: 2.9 usec per loop random.randboolchoice要慢得多。

3 个答案:

答案 0 :(得分:1)

Ruby 中,很常见的是实现mixins,它可以增强标准库中类的可用方法。很多Rails的东西都是这样构建的。

但我没有看到任何迹象表明这是Python的好习惯。如果标准模块缺少某些功能,那么创建自己的模块就很常见了。这样做的好处是,您不要为可能会查看您的代码的任何其他人创建一些函数/方法来自标准集的印象。我认为大多数 Pythonistas 信任他们在模块开头看到的导入。

如果您的方法较慢,我无法回答。我过去必须使用元编程来“修补”原始的Python库,但这样做是为了确保我们为测试方法提供一致的接口。

答案 1 :(得分:1)

这有些基于意见,但我会尝试回顾一下我的意见。

修补标准库模块通常被认为是不好的形式 - 内置甚至可以禁止猴子修补。我不这样做的主要原因是为了保持一致性。如果其他人看到了你的代码(或者你以后又回来了),那么你可能认为看起来没有random.randbool的文档或规范。这是误导性的,而这种反对python的“明确比隐含更好”的口头禅。

相反,我建议选择最快的方法(random.random() < .5),然后用它来制作一个辅助函数。由于性能似乎是一个问题,这是我的机器为一些相关的例子提供的:

In [30]: %timeit randbool()
10000000 loops, best of 3: 184 ns per loop

In [31]: %timeit random.random() < .5
10000000 loops, best of 3: 114 ns per loop

In [32]: %timeit random.randint(0,1)
1000000 loops, best of 3: 1.18 µs per loop

如果您想要使用辅助函数进行打字,那么这就是您所得到的:

In [33]: %timeit bool(randbool())
1000000 loops, best of 3: 310 ns per loop

总的来说还是相当快,即使有函数调用的开销(无论如何都要从修补random获得)。

答案 2 :(得分:0)

你回答了你的问题:

无论是什么

  1. 更易于阅读
  2. 执行速度更快
  3. 写作时间更短
  4. 更好。这是我的优先顺序,以适合您的方式对它们进行重新排序并满足您的需求。