파이썬은 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.maxint
Python int가 보유 할 수있는 최대 값을 포함합니다.- 64 비트 Python 2.7에서 크기는 24 바이트입니다. 으로 확인하십시오
sys.getsizeof()
.
- 64 비트 Python 2.7에서 크기는 24 바이트입니다. 으로 확인하십시오
- Python 3 :
sys.maxsize
Python 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.
참고URL : https://stackoverflow.com/questions/2104884/how-does-python-manage-int-and-long
'code' 카테고리의 다른 글
javax.inject.Named 주석은 무엇을 위해 사용됩니까? (0) | 2020.08.15 |
---|---|
Dockerfile에서 로컬 이미지를 기본 이미지로 사용하려면 어떻게해야합니까? (0) | 2020.08.15 |
여러 awaits보다 단일 'await Task.WhenAll'을 선호해야하는 이유는 무엇입니까? (0) | 2020.08.15 |
"?"가있는 신속한 변수 장식 (0) | 2020.08.15 |
"모든 제네릭 유형"정의가있는 C # 제네릭 "where constraint"? (0) | 2020.08.15 |