programing

인덱스 변수 없이 N번 무언가를 하는 파이썬적인 방법?

css3 2023. 6. 4. 22:31

인덱스 변수 없이 N번 무언가를 하는 파이썬적인 방법?

다음과 같은 코드가 있습니다.

for i in range(N):
    do_something()

저는 N번 하고 싶어요.루프 내부의 코드는 다음 값에 의존하지 않습니다.i.

쓸모없는 색인 변수를 만들지 않고 이 간단한 작업을 하는 것이 가능할까요, 아니면 더 우아한 방법으로? 어떻게?

루프를 반복하는 것보다 약간 빠른 접근 방식xrange(N)다음과 같습니다.

import itertools

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

사용_변수, 예를 들어 다음과 같습니다.

# A long way to do integer exponentiation
num = 2
power = 3
product = 1
for _ in range(power):
    product *= num
print(product)

그냥 사용합니다.for _ in range(n)그것은 요점을 직설적으로 말해요.Python 2에서 거대한 숫자에 대한 전체 목록을 생성할 것이지만, Python 3을 사용하고 있다면 문제가 되지 않습니다.

함수가 퍼스트 클래스 시민이므로 작은 포장지를 작성할 수 있습니다(Alex 답변에서).

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

그러면 함수를 인수로 전달할 수 있습니다.

_는 x와 같습니다.그러나 이것은 사용하지 않을 식별자를 나타내는 데 사용되는 파이썬 관용구입니다.파이썬에서 이러한 식별자는 다른 언어의 변수처럼 메모리를 사용하거나 공간을 할당하지 않습니다.그것을 잊기 쉽습니다.이들은 객체를 가리키는 이름일 뿐입니다. 이 경우 각 반복의 정수입니다.

저는 다양한 답변(특히 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

따라서 지도를 사용하면 루프 기준보다 약 30%, 마르텔리 기준보다 추가로 19% 향상됩니다.

do_something을 함수로 정의하고 N번 수행한다고 가정합니다.다음을 시도할 수 있습니다.

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

간단한 시간 루프는 어떻습니까?

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

변수가 이미 있습니다. 변수를 사용하지 않으시겠습니까?

언급URL : https://stackoverflow.com/questions/2970780/pythonic-way-to-do-something-n-times-without-an-index-variable