파이썬은 int와 long을 어떻게 관리합니까?


118

파이썬이 내부적으로 int 및 long 유형을 관리하는 방법을 아는 사람이 있습니까?

  • 올바른 유형을 동적으로 선택합니까?
  • int의 한계는 무엇입니까?
  • Python 2.6을 사용하고 있는데 이전 버전과 다릅니 까?

아래 코드를 어떻게 이해해야합니까?

>>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>

최신 정보:

>>> print type(0x7fffffff)
<type 'int'>
>>> print type(0x80000000)
<type 'long'>

CPython에서 즉시 stdc 유형에 매핑하지 않습니까?
Aiden Bell

네, 그렇다고 생각합니다. 나는 또한 모든 것이 힙에 할당되어 있다고 생각하기 때문에 숫자가 더 많은 정밀도를 필요로 할 때 realloc괜찮습니다. 하지만 확실하지 않아서 다른 사람에게 답을 남기겠습니다.
zneak 2010 년

2
또한 파이썬이 긴 변수를 사용하도록 강제 할 수 있습니다var = 666L
qba

8
@Ignacio : WRONG A CPython int은 C입니다 long(기본값은 서명 됨) ... 참조 <CPython 2.X source>/Include/intobject.h: typedef struct {PyObject_HEAD long ob_ival; } PyIntObject; 어쨌든 Python 2.x int는 음수를 허용합니다. C unsigned는 대처할 수 없습니다.
John Machin

PEP 237은 파이썬이이 모든 것을 똑같이 보이게 만드는 방법에 대해 설명합니다.
Carel

답변:


124

int그리고 몇 가지 버전long 을 "통합" 했습니다 . 그 전에는 수학 연산을 통해 int를 오버플로 할 수있었습니다.

3.x는 long을 모두 제거하고 int 만 사용하여이를 더욱 발전 시켰습니다.

  • Python 2 : sys.maxintPython int가 보유 할 수있는 최대 값을 포함합니다.
    • 64 비트 Python 2.7에서 크기는 24 바이트입니다. 으로 확인하십시오 sys.getsizeof().
  • Python 3 : sys.maxsizePython int가 될 수있는 최대 크기 (바이트)를 포함합니다.
    • 이는 32 비트에서 기가 바이트, 64 비트에서 엑사 바이트입니다.
    • 이러한 큰 int는의 거듭 제곱에 대해 8과 유사한 값을 갖습니다 sys.maxsize.

30
그러나 Python3은이 유형을 'int'라고 부릅니다. 비록 2.x의 'long'과 더 비슷하게 작동하더라도 말입니다.

3
Ted의 의견 : 아래에서 언급했듯이 maxint보다 큰 int에 무언가를 캐스팅하면 여전히 long >>> type (int (sys.maxint + 1)) <type 'long'>
StuartLC

2
sys.maxint는 64 비트 시스템에서 가장 큰 64 비트 정수를 제공합니다. Long은 64 비트보다 훨씬 클 수 있습니다. "sys.maxint << 1000000"만 시도해보십시오.
fccoelho

4
python3에서는 sys.maxsize
pylover

3
sys.maxsize는 정수와 관련이 없습니다. 정수에 대한 최대 크기가 없기 때문에 Python 3의 sys.maxint가 제거되었습니다 (Python 3 int은 Python 2와 동일합니다 long).
asmeurer 2014 년

19

PEP 가 도움이 될 것입니다.

결론은 파이썬 버전 2.4 이상에서는 걱정할 필요가 없다는 것입니다.


15
int (예 : long)에 맞지 않는 무언가로 c에서 int 함수를 호출해야한다면 걱정해야합니다. long-> int 캐스팅의 양은 도움이되지 않습니다. 최근에 저에게 일어났습니다.
Macke 2012 년

1
@Macke :이 코멘트는 나를 구했고, 나는 int가 트릭을 할 것이라고 생각했고 왜 여전히 Jython 예외가 발생하는지 궁금했습니다.
ted

@Macke 절대적으로 사실입니다. 현재 제가 일하는 회사에서는 Tkinter 항목을 통해 사용자 입력을 받아 TCP / IP를 통해 캐스트 된 값을 임베디드 시스템을 모방 한 클라이언트 (C / C ++로 작성 됨)로 보내는 Python으로 작성된 Simulator가 있습니다. P : 때 파이썬 기반의 항목 더 ... 100,000,000,000,000,000,000,000 삽입 무슨 상상
rbaleksandar

@Mackie는 실제로 PEP를 읽으려고했다면 다음과 같이 명시 적으로 말합니다. C API는 변경되지 않습니다. C 코드는 여전히 short int와 long int의 차이를 인식해야합니다. (Python 3.0 C API는 아마도 완전히 호환되지 않을 것입니다.) PyArg_Parse * () API는 C int 또는 long으로 표현할 수있는 범위 내에있는 한 이미 long int를 허용하므로 C int 또는 long 인수를받는 함수는 ' 파이썬 long을 다루는 것에 대해 걱정할 필요가 없습니다.
cowbert

4

내 컴퓨터에서 :

>>> print type(1<<30)
<type 'int'>
>>> print type(1<<31)
<type 'long'>
>>> print type(0x7FFFFFFF)
<type 'int'>
>>> print type(0x7FFFFFFF+1)
<type 'long'>

파이썬은 32 비트에 맞는 값에 대해 int (32 비트 부호있는 정수, 내부적으로 C int인지 여부는 모르겠 음)를 사용하지만, 자동으로 long (임의로 많은 수의 비트, 즉 bignums)으로 전환합니다. 더 큽니다. 나는 이것이 큰 숫자로의 원활한 전환으로 오버플로를 피하면서 더 작은 값에 대한 속도를 높일 것이라고 생각합니다.


4

흥미 롭군. 내 64 비트 (i7 Ubuntu) 상자에서 :

>>> print type(0x7FFFFFFF)
<type 'int'>
>>> print type(0x7FFFFFFF+1)
<type 'int'>

더 큰 컴퓨터에서 64 비트 정수까지 단계를 진행한다고 생각합니다.


2
Python은 머신에 사용할 수있는 더 큰 정수 유형을 사용합니다. 따라서 일반적으로 32 비트 컴퓨터에서는 int 크기가 32 비트이고 64 비트 컴퓨터에서는 64 비트 크기입니다. 그러나 64 비트 정수를 정의하는 32 비트 아키텍처가있을 수 있습니다.이 경우 파이썬은 64 비트 정수를 사용합니다.
Bakuriu

4

Python 2.7.9는 숫자를 자동으로 승격합니다. int () 또는 long ()을 사용하는 것이 확실하지 않은 경우.

>>> a = int("123")
>>> type(a)
<type 'int'>
>>> a = int("111111111111111111111111111111111111111111111111111")
>>> type(a)
<type 'long'>

4

Python 2는 값의 크기에 따라 유형을 자동으로 설정합니다. 최대 값에 대한 가이드는 아래에서 찾을 수 있습니다.

Python 2에서 기본 Int의 Max 값은 65535이며 그 이상의 값은

예를 들면 :

>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>

Python 3에서는 long 데이터 유형이 제거되었으며 모든 정수 값은 Int 클래스에 의해 처리됩니다. Int의 기본 크기는 CPU 아키텍처에 따라 다릅니다.

예를 들면 :

  • 32 비트 시스템 정수의 기본 데이터 유형은 'Int32'입니다.
  • 64 비트 시스템 정수의 기본 데이터 유형은 'Int64'입니다.

각 유형의 최소 / 최대 값은 아래에서 찾을 수 있습니다.

  • Int8 : [-128,127]
  • Int16 : [-32768,32767]
  • Int32 : [-2147483648,2147483647]
  • Int64 : [-9223372036854775808,9223372036854775807]
  • Int128 : [-170141183460469231731687303715884105728,170141183460469231731687303715884105727]
  • UInt8 : [0,255]
  • UInt16 : [0,65535]
  • UInt32 : [0,4294967295]
  • UInt64 : [0,18446744073709551615]
  • UInt128 : [0,340282366920938463463374607431768211455]

Int의 크기가 위에서 언급 한 제한을 초과하면 파이썬은 자동으로 유형을 변경하고 최소 / 최대 값의 증가를 처리하기 위해 더 많은 메모리를 할당합니다. Python 2에서는 'long'으로 변환되지만 이제는 Int의 다음 크기로 변환됩니다.

예 : 32 비트 운영 체제를 사용하는 경우 Int의 최대 값은 기본적으로 2147483647입니다. 2147483648 이상의 값이 할당되면 유형이 Int64로 변경됩니다.

int의 크기와 메모리 할당을 확인하는 방법에는 여러 가지가 있습니다. 참고 : Python 3에서 내장 type () 메서드를 <class 'int'>사용하면 사용중인 Int 크기에 관계없이 항상 반환 됩니다.


1

python 3.x부터 통합 정수 라이브러리는 이전 버전보다 훨씬 더 똑똑합니다. 내 (i7 Ubuntu) 상자에 다음이 있습니다.

>>> type(math.factorial(30))
<class 'int'>

구현 세부 사항은 Include/longintrepr.h, Objects/longobject.c and Modules/mathmodule.c파일을 참조 하십시오. 마지막 파일은 동적 모듈 (so 파일로 컴파일 됨)입니다. 코드는 잘 설명되어 있습니다.


1

여기에 제공된 모든 답변, 특히 @James Lanes를 계속하려면

정수 유형의 크기는 다음 공식으로 표현할 수 있습니다.

총 범위 = (2 ^ 비트 시스템)

하한 =-(2 ^ 비트 시스템) * 0.5 상한 = ((2 ^ 비트 시스템) * 0.5)-1


0

때문에 그들을 관리 int하고 long클래스 정의를 형제된다. 적절한 클래스의 결과를 생성하는 +,-, *, / 등에 대한 적절한 메서드가 있습니다.

예를 들면

>>> a=1<<30
>>> type(a)
<type 'int'>
>>> b=a*2
>>> type(b)
<type 'long'>

이 경우 클래스 int에는 필요할 때 결과 __mul__를 생성하는 메서드 (*를 구현 하는 메서드)가 long있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.