2017-11-22 7 views
0

두 개의 별도 변수에서 바닥 나누기와 나머지를 동시에 가져올 수있는 Python 기본 제공 (또는 최적화 됨) 기능이 있습니까?두 개의 별도 변수에서 동시에 바닥 나누기 및 나머지 가져 오기

예 :

a, b = 10 divided by 4 

원하는 결과는 :

a = 2 
b = 2 

I는이 최적 솔루션이 될 필요가있다.

성능 결과 : 코드의

첫 번째 조각 : 코드의

for i in range(10000000): 
    a, b = divmod(i, 5) 
took 3.99 seconds to run 

두 번째 조각 :

for i in range(10000000): 
    a = i // 5 
    b = i % 5 
took 2.56 seconds to run 

비고 :

자세한 설명은 @casevh 답변을 읽어보십시오.

tldr : divmod()는 숫자가 큰 경우 더 잘 작동합니다.

+1

내가 확인 할이 코드 후에없는 추측 만 생각하고 : A = 10 B = 2 는 DIV = A // B 모드 = A % B의 내장의 내가 어떤 종류를 찾고 있었다 –

+0

@KatiaPunter 왜냐하면 때때로 그것들은 훨씬 더 빠르기 때문입니다. 그러나 나는 그 해결책에 시간을두고 어떤 것이 더 잘 수행되는지 보게 될 것이다. 감사합니다 – joaoavf

+0

@joaoavf이 번호는 어디서 났습니까? '실행하는데 2.56 초 걸렸고''실행하는데 3.99 초 걸렸습니다. ' –

답변

7

사용하십시오. 이것은 당신을 도울 것입니다.

a,b = divmod(10,2) 

이 두 값

+0

뭔가 빠졌습니까? 그것은 단지'a = 2'와'b = 2'를 제공하기 때문에 OP가'b = 0.5'를 요구 한 곳이 아닙니다. –

+1

오, 그는 평범한 'a % b'을 묻는 질문을 편집했습니다. 공정하다. –

+0

이것은 내가 필요한 것을 정확히 다룹니다. 성능을 테스트 해 보겠습니다. 고맙습니다. – joaoavf

4

난 당신이 divmod() 라이브러리 함수 여기

찾고있는 생각을 반환은 유의 한 차이가있는 link to its docs

>>> a, b = divmod(10, 4) 
>>> print a, b 
>>> 2 2 
1

입니다 성능면에서 큰 숫자를 사용합니다.

$ py27 -m timeit -s "a=123;b=7" "divmod(a,b)" 
10000000 loops, best of 3: 0.0913 usec per loop 
$ py27 -m timeit -s "a=123;b=7" "a//b;a%b" 
10000000 loops, best of 3: 0.047 usec per loop 
$ py27 -m timeit -s "a=123333333333333333333333333333333333333;b=7222222222222222222" "divmod(a,b)" 
10000000 loops, best of 3: 0.165 usec per loop 
$ py27 -m timeit -s "a=123333333333333333333333333333333333333;b=7222222222222222222" "a//b;a%b" 
1000000 loops, best of 3: 0.232 usec per loop 

왜 차이 : 여기

는 크고 작은 번호를 사용하는 예입니다?

divmod()는 함수 호출이 필요하고 // 및 %는 연산자입니다. 연산자와 관련하여 함수 호출에 대한 추가 오버 헤드가 있습니다. 따라서 계산 비용이 최소 일 때 함수 호출의 오버 헤드는 실제 계산 비용보다 훨씬 큽니다.

큰 숫자의 경우 divmod()가 빠릅니다. divmod()는 몫과 나머지를 동시에 계산하고 둘 다 반환합니다. // 연산자와 % 연산자는 각각 몫과 나머지를 계산하지만 결과 중 하나만 반환합니다.

divmod()는 오버 헤드가 있지만 한 부분 만 수행합니다. // 및 %는 오버 헤드가 적지 만 두 개의 분할을 수행합니다. 분할을 수행하는 데 비해 오버 헤드가 큰 경우 divmod()가 느려집니다.그러나 부서의 비용이 오버 헤드보다 크면 divmod()가 더 빠릅니다.

+0

정말 고마워요! 당신의 통찰력에 진심으로 감사드립니다. – joaoavf