gpt4 book ai didi

python - 使用 while 循环是最佳实践时,python 中是否存在任何情况?

转载 作者:太空狗 更新时间:2023-10-30 02:13:26 25 4
gpt4 key购买 nike

我正在做一些 python 基准测试,我发现 repeat(None)while Truewhile 1 快得多>:

>>> def bench7():
... foo = 0
... a = time()
... for i in repeat(None):
... foo += 1
... if foo == 100000000:
... break
... b = time()
... print a, b, b-a
...
>>> def bench8():
... foo = 0
... a = time()
... while True:
... foo += 1
... if foo == 100000000:
... break
... b = time()
... print a, b, b-a
...
>>> bench7()
1326592924.41 1326592935.42 11.0051281452
>>> bench7()
1326592936.36 1326592947.48 11.1183578968
>>> bench8()
1326592951.47 1326592965.03 13.5640599728
>>> bench8()
1326592966.07 1326592979.6 13.5341670513`

while 循环的这种用法是我实际使用 while 循环的最后一件事。还有什么理由可以使用我忽略的 while 吗?

最佳答案

while True 只是因为全局查找 True 而变慢。如果您改用 while 1,while 循环应该轻松击败 for-repeat(至少在速度、美观和清晰度方面):

>>> from dis import dis
>>> def f():
while True:
print

>>> dis(f)
2 0 SETUP_LOOP 11 (to 14)
>> 3 LOAD_GLOBAL 0 (True)
6 POP_JUMP_IF_FALSE 13
3 9 PRINT_NEWLINE
10 JUMP_ABSOLUTE 3
>> 13 POP_BLOCK
>> 14 LOAD_CONST 0 (None)
17 RETURN_VALUE

>>> def g():
while 1:
print

>>> dis(g)
2 0 SETUP_LOOP 4 (to 7)
3 >> 3 PRINT_NEWLINE
4 JUMP_ABSOLUTE 3
>> 7 LOAD_CONST 0 (None)
10 RETURN_VALUE

repeat 的主要用例是向 imapizip 提供常量值流。例如,以下计算二次幂之和:sum(imap(pow, repeat(2), xrange(10)))

repeat itertool 也可用于加速不需要更改变量的 for 循环。例如,Guido 使用这种技术来最小化 timeit 模块中的循环开销:http://hg.python.org/cpython/file/40e1be1e0707/Lib/timeit.py#l188

要回答您的另一个问题,“是否有任何理由使用 while 循环”。答案是肯定的。 Python 的 for 循环实际上是一个 foreach,它使用迭代器来生成值流。相比之下,while 循环要么是无限的(如 while-True 示例中的那样),要么在满足特定条件时终止(例如,循环用户输入直到用户键入“退出”或类似内容)。

可以在 Collatz conjecture 的示例中看到 while 循环和 for 循环的对比功能。 while 循环不能轻易替换为 for 循环的地方:

def collatz(n):
print n
while n > 1:
n = n // 2 if n % 2 == 0 else n * 3 + 1
print n

通过搜索 Python's standard library 可以看到更多 while 循环的示例和用例.

总而言之,while 语句是您工具包的重要组成部分:-)

关于python - 使用 while 循环是最佳实践时,python 中是否存在任何情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8867043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com