code

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

codestyles 2020. 8. 15. 09:16
반응형

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


파이썬이 내부적으로 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'>

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.

PEP 가 도움이 될 것입니다.

결론은 파이썬 2.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)으로 전환합니다. 더 큽니다. 나는 이것이 큰 숫자로의 원활한 전환으로 오버플로를 피하면서 더 작은 값에 대한 속도를 높일 것이라고 생각합니다.


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

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

더 큰 컴퓨터에서 최대 64 비트 정수까지 단계를 수행합니다.


Python 2.7.9 auto promotes numbers. For a case where one is unsure to use int() or long().

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

Python 2 will automatically set the type based on the size of the value. A guide of max values can be found below.

The Max value of the default Int in Python 2 is 65535, anything above that will be a long

For example:

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

In Python 3 the long datatype has been removed and all integer values are handled by the Int class. The default size of Int will depend on your CPU architecture.

For example:

  • 32 bit systems the default datatype for integers will be 'Int32'
  • 64 bit systems the default datatype for integers will be 'Int64'

The min/max values of each type can be found below:

  • 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]

If the size of your Int exceeds the limits mentioned above, python will automatically change it's type and allocate more memory to handle this increase in min/max values. Where in Python 2, it would convert into 'long', it now just converts into the next size of Int.

Example: If you are using a 32 bit operating system, your max value of an Int will be 2147483647 by default. If a value of 2147483648 or more is assigned, the type will be changed to Int64.

There are different ways to check the size of the int and it's memory allocation. Note: In Python 3, using the built-in type() method will always return <class 'int'> no matter what size Int you are using.


From python 3.x, the unified integer libries are even more smarter than older versions. On my (i7 Ubuntu) box I got the following,

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

For implementation details refer Include/longintrepr.h, Objects/longobject.c and Modules/mathmodule.c files. The last file is a dynamic module (compiled to an so file). The code is well commented to follow.


Just to continue to all the answers that were given here, especially @James Lanes

the size of the integer type can be expressed by this formula:

total range = (2 ^ bit system)

lower limit = -(2 ^ bit system)*0.5 upper limit = ((2 ^ bit system)*0.5) - 1


It manages them because int and long are sibling class definitions. They have appropriate methods for +, -, *, /, etc., that will produce results of the appropriate class.

For example

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

In this case, the class int has a __mul__ method (the one that implements *) which creates a long result when required.


From Python 3.x all integer values are part of the Int class. Integers size in now dependent on the CPU architecture. enter image description here

참고URL : https://stackoverflow.com/questions/2104884/how-does-python-manage-int-and-long

반응형