在Python中,我可以实现一个带有步骤计数器和停止条件的循环,作为for循环的一个经典情况:
for i in range(50):
    result = fun(i)
    print(i, result)
    if result == 0: 
        break其中fun(x)是从整数到整数的任意函数。
我一直在怀疑,这是否是最好的方式来编码它(Pythonically,,在可读性,和效率),还是更好地运行它作为一个,而循环
i = 0
result = 1
while result != 0 and i < 50:
    result = fun(i)
    print(i, result)
    i += 1哪种方法更好?特别是-我担心的是break语句的用法,这感觉不太正确。
发布于 2017-07-10 08:40:15
for循环的性能略高于while,因为在C中实现。,同时对+=操作进行解释,并要求创建/销毁更多操作和对象。您可以使用模块来说明性能差异,例如:
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循环可以说是在绝大多数情况下,当您希望在可迭代对象上迭代时,要使用更多Pythonic语言。。此外,引用Python wiki:“因为Python中的for循环非常强大,但是很少使用,除非需要用户的输入”。使用break语句本身没有什么非Pythonic的。
可读性主要是主观的,我认为for循环的可读性也更强,但它可能取决于您以前的编程背景和经验。
发布于 2017-07-07 12:23:32
在表现上有很小的差别。由于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)时间已过11.082087516784668 这里是14.429940938949585 备选方案1.4022133350372314
但是,如果您想/必须使用一个循环,那么for-循环通常是更多的Pythonic方式,正如在这个对相关问题的正确回答中所解释的那样。
编辑: Chris Rands下面的答案是从C代码的角度来解释的,并且使用了一个更精确的(尽管在我强迫这个例子是这样的宏级别上)计时模块。也要读他的答案。
发布于 2017-07-11 16:55:21
最好的方法是根本不显式地循环。救援的迭代工具:
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 ithttps://stackoverflow.com/questions/44481346
复制相似问题