2009-09-06 8 views
9

저는 100000 자리 숫자를 처리해야하는 프로그래밍 문제에 대해 연구하고 있습니다. 파이썬이 이런 식의 숫자를 처리 할 수 ​​있습니까? 그것을 할 수코드에서 큰 숫자 처리

+1

매우 유사 : http://stackoverflow.com/questions/538551/handling-very-large-numbers-in-python –

+1

이 숫자로 무엇을하는지에 따라 로그 (숫자). – mpen

답변

3

물론이 :

>>> s = 10 ** 100000 
3

잘 작동하는 것 같다 :

>>> x = 10**100000 
>>> x 
10000000000000000000000000000000000000000000000000000000000000000000000000000000 
[snip] 
00000000L 

http://docs.python.org/library/stdtypes.html에 따르면, 아마 그 크기가 제한되지 않는다는 것을 의미한다 "긴 정수 무제한 정밀도를 가지고".

7

예; Python 2.x에는 intlong의 두 가지 유형이 있으며, 무제한 크기는입니다. 그러나 필요한 경우 모든 계산이 자동으로 변환됩니다. 큰 숫자를 다루는 것은 괜찮지 만, 100000 자릿수를 출력하려고하거나 심지어 문자열을 만들려고하면 더 느린 것 중 하나가 될 것입니다.

소수 자릿수 고정 소수점 정밀도가 필요한 경우 십진수 모듈이 있습니다.

23

다른 답변으로 지적한대로 파이썬은 사용 가능한 메모리 양에 의해서만 제한되는 정수를 지원합니다. 당신이 그들을 위해 더 빨리 지원을 원하는 경우에, ;-) gmpy은 (gmpy의 저자이자 현재 공동 테이너로 여기 물론 약간의 편견 해요 시도 :

일반적으로
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'x+1' 
10000 loops, best of 3: 114 usec per loop 
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'y+1' 
10000 loops, best of 3: 65.4 usec per loop 

는, 산술 작업을위한 병목 아니다 그러한 숫자 (일부 조합 및 숫자 이론적 기능에 대한 gmpy의 직접적인 지원이 그러한 숫자를 사용하는 경우 도움이 될 수 있음). 진수 문자열로 숫자를 켜기 ... 아마 느린 느낄 것이다 일반적인 작업입니다 : 보시다시피

$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'str(x)' 
10 loops, best of 3: 3.11 sec per loop 
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'str(y)' 
10 loops, best of 3: 27.3 msec per loop 

는 엄청난 수의도에 gmpy 문자열 화 (stringification)는 간단한 또한보다 느린 수백 번 할 수 있습니다 (아아, 그것은 본질적으로 복잡한 작업입니다!); 하지만 네이티브 파이썬 코드에서 시간의 비율은 수만 시간이 단순한 것보다 느려질 수 있으므로, 특히 당신이 다운로드하고 설치하지 않기로 결정한 경우에 특히 조심하고 싶습니다. (예 : 할 수 없습니다 : 예, gmpy는 현재 Google App Engine에서 지원되지 않습니다.) 마지막으로

, 중간 케이스 : gmpy으로 둔화 미만 100 시간 동안 기본 파이썬 코드에서 두 개의 거대한 수를 곱하여

$ python2.6 -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'x*x' 
10 loops, best of 3: 90 msec per loop 
$ python2.6 -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'y*y' 
100 loops, best of 3: 5.63 msec per loop 
$ python2.6 -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'y*x' 
100 loops, best of 3: 8.4 msec per loop 

보시다시피가, 단순한 또한보다 약 1000 배 속도가 느려질 수 있습니다 (숫자가 이미 gmpy의 자체 형식이기 때문에 하나만있는 경우에도 그다지 나쁘지 않으므로 다른 형식을 변환하는 오버 헤드가 발생합니다.)

+0

gmpy에 감사드립니다! 나는 그것을 Coursera의 암호 과정에 사용하고 있습니다. –

+0

GMPY2는 정수 및 합리적인 산술에 대해 GMP 라이브러리를 지원하지만 GMPY2는 MPFR 및 MPC 라이브러리에서 제공하는 다중 정밀도 실수 및 복소수 산술에 대한 지원을 추가합니다. GMP (GNU 다중 정밀도 산술 라이브러리)는 모든 피연산자 크기에 대해 다른 bignum 라이브러리보다 빠른 것을 목표로합니다. http://en.wikipedia.org/wiki/GNU_Multiple_Precision_Arithmetic_Library –

3

이미 지적했듯이 파이썬은 메모리가 허용하는만큼 큰 숫자를 처리 할 수 ​​있습니다. 숫자가 커지면 모든 작업의 ​​비용이 증가하므로 추가하고 싶습니다. 이것은 인쇄/문자열 변환 (가장 느리지 만)에 두 개의 큰 수 (하드웨어가 네이티브로 처리 할 수있는 것보다 큽니다)를 더하면 더 이상 O (1)이 아닙니다.

파이썬이 큰 숫자로 작업하는 것에 대한 세부 사항을 깔끔하게 숨기지 만,이 큰 숫자 연산은 항상 일반 int에있는 연산과 같지 않다는 점을 명심해야한다.