带计数器和条件的结束循环

2024-05-16 08:36:05 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,我可以用step counter和stop条件实现循环,这是循环的经典情况:

for i in range(50):
    result = fun(i)
    print(i, result)
    if result == 0: 
        break

其中fun(x)是从整数到整数的任意函数。

我一直怀疑这是否是对它进行编码的最佳方法(pythonical,以及在可读性和效率方面),或者是将它作为一个while循环运行更好:

i = 0
result = 1
while result != 0 and i < 50:
    result = fun(i)
    print(i, result)
    i += 1

哪种方法更好?尤其是-我担心break语句的使用,这感觉不对。


Tags: 方法inforstepcounter情况整数result
3条回答

最好的方法是根本不显式循环。救援工具:

from itertools import takewhile
it = ((x, f(x)) for x in range(50)) # first you define the resulting view
it = takewhile(lambda y: y[1] != 0, it) # define when to stop iterating
list(map(print, it)) # if you want to print it

+比循环快得多

for循环的性能略高于while,因为^{} is implemented in C,同时+=操作被解释,需要more operations和对象创建/销毁。您可以使用^{} module来说明性能差异,例如:

from timeit import timeit

def for_func():
    for i in range(10000):
        result = int(i)
        if result == -1: 
            break

def while_func():
    i = 0
    result = 1
    while result != -1 and i < 10000:
        result = int(i)
        i += 1


print(timeit(lambda: for_func(), number = 1000))
# 1.03937101364
print(timeit(lambda: while_func(), number = 1000))
# 1.21670079231 

for循环可以说是more Pythonic in the vast majority of cases when you wish to iterate over an iterable object。此外,引用Python wiki:“因为Python中的for循环非常强大,而除了在需要用户输入的情况下很少使用”。使用break语句本身并没有什么不切实际的。

可读性主要是主观的,我认为for循环也更具可读性,但这可能取决于您以前的编程背景和经验。

表演上有细微的差别。由于while循环在每次迭代时都执行额外的布尔检查,因此速度稍微慢一些。

但是,对于您想要评估的大多数函数,有一种替代方法可以首先使用循环,这是一种更快的方法。请参阅下面的示例。我确信还有更优化的实现。。

import time

def fun(step):
    return step == 50000000

t1 = time.time()
for i in range(500000000):
    result = fun(i)
#    print(i, result)
    if result == 1: 
        break
print("time elapsed", time.time() - t1)

t2 = time.time()
i = 0
result = 0
while result != 1 and i < 50000000:
    result = fun(i)
#    print(i, result)
    i += 1

print("and here", time.time() - t2)

import numpy as np

t3 = time.time()

foo = np.arange(500000000)
i = np.where(foo == 50000000)
print("Alternative", time.time()-t3)

time elapsed 11.082087516784668

and here 14.429940938949585

Alternative 1.4022133350372314

但是,如果您想/必须使用循环,那么for循环通常是更为python的方式,如in this nice answer to a related question所述

编辑:Chris Rands在下面的回答从C代码的角度解释了这一点,并使用了一个更精确的计时模块(尽管在我强制这个例子的宏级别上,这并不重要)。也要读他的答案。

相关问题 更多 >