coding-style - leetcode - python for loop使用



pythonic方式做某事没有索引变量N次? (6)

我每天都爱蟒蛇,越来越多。

今天,我正在编写一些代码,如:

for i in xrange(N):
    do_something()

我必须做N次。 但每次都不依赖于i (index变量)的值。 我意识到我正在创建一个我从未使用过的变量( i ),并且我认为“确实有更多的pythonic方法来做到这一点,而不需要这个无用的索引变量。”

所以......问题是:你是否知道如何用更多(pythonic)美丽的方式完成这个简单的任务?


Answer #1

_与x相同。 然而,这是一个python习惯用法,用于表示您不打算使用的标识符。 在python中,这些标识符不会像其他语言中的变量那样记忆或分配空间。 很容易忘记这一点。 它们只是指向对象的名称,在这种情况下,每次迭代都是一个整数。


Answer #2

一个简单的while循环呢?

while times > 0:
    do_something()
    times -= 1

你已经有了变量; 为什么不使用它?


Answer #3

假设你已经将do_something定义为一个函数,并且你想执行它N次。 也许你可以尝试以下方法:

todos = [do_something] * N  
for doit in todos:  
    doit()

Answer #4

我发现各种答案真的很优雅(特别是Alex Martelli的),但我想要第一手量化性能,所以我编写了以下脚本:

from itertools import repeat
N = 10000000

def payload(a):
    pass

def standard(N):
    for x in range(N):
        payload(None)

def underscore(N):
    for _ in range(N):
        payload(None)

def loopiter(N):
    for _ in repeat(None, N):
        payload(None)

def loopiter2(N):
    for _ in map(payload, repeat(None, N)):
        pass

if __name__ == '__main__':
    import timeit
    print("standard: ",timeit.timeit("standard({})".format(N),
        setup="from __main__ import standard", number=1))
    print("underscore: ",timeit.timeit("underscore({})".format(N),
        setup="from __main__ import underscore", number=1))
    print("loopiter: ",timeit.timeit("loopiter({})".format(N),
        setup="from __main__ import loopiter", number=1))
    print("loopiter2: ",timeit.timeit("loopiter2({})".format(N),
        setup="from __main__ import loopiter2", number=1))

我还想出了一个建立在Martelli之上的替代解决方案,并使用map()来调用有效载荷函数。 好吧,我欺骗了一下,因为我让自由度让有效载荷接受了一个被丢弃的参数:我不知道是否有办法解决这个问题。 尽管如此,结果如下:

standard:  0.8398549720004667
underscore:  0.8413165839992871
loopiter:  0.7110594899968419
loopiter2:  0.5891903560004721

因此使用map可以比标准for循环提高约30%,并比Martelli提高19%。


Answer #5

既然功能是一等公民,你可以写小包装(来自Alex的答案)

def repeat(f, N):
    for _ in itertools.repeat(None, N): f()

那么你可以传递函数作为参数。


Answer #6

比在xrange(N)上循环更快的方法是:

import itertools

for _ in itertools.repeat(None, N):
    do_something()




python