Python没有<\/button>
函数,但它有random.randbool
,randint
和randrange
。如果我想使用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.randbool
和choice
要慢得多。
答案 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)
你回答了你的问题:
无论是什么
更好。这是我的优先顺序,以适合您的方式对它们进行重新排序并满足您的需求。