Как Python управляет int и long?
Кто-нибудь знает, как Python управляет внутренними int и длинными типами?
- Он выбирает правильный тип динамически?
- Каков предел для int?
- Я использую Python 2.6, Is отличается от предыдущих версий?
Как мне понять код ниже?
>>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>
Обновление:
>>> print type(0x7fffffff)
<type 'int'>
>>> print type(0x80000000)
<type 'long'>
Ответы
Ответ 1
int
и long
были "объединены" несколько версий назад. До этого можно было переполнить int через математические операции.
3.x продвинулся дальше в этом, полностью исключив long и имея только int.
- Python 2:
sys.maxint
содержит максимальное значение, которое может содержать Python int. - На 64-битном Python 2.7 размер составляет 24 байта. Проверьте с помощью
sys.getsizeof()
.
- Python 3:
sys.maxsize
содержит максимальный размер в байтах, который может быть int Python. - Это будут гигабайты в 32 битах и эксабайты в 64 битах.
- Такое большое значение типа int будет иметь значение, аналогичное 8, в степени
sys.maxsize
.
Ответ 2
Этот PEP должен помочь.
Нижняя строка заключается в том, что вам действительно не нужно беспокоиться об этом в версиях python > 2.4
Ответ 3
На моей машине:
>>> print type(1<<30)
<type 'int'>
>>> print type(1<<31)
<type 'long'>
>>> print type(0x7FFFFFFF)
<type 'int'>
>>> print type(0x7FFFFFFF+1)
<type 'long'>
Python использует ints (32-разрядные целые числа со знаком, я не знаю, являются ли они C ints под капотом или нет) для значений, которые вписываются в 32 бит, но автоматически переключается на longs (произвольно большое количество бит - то есть bignums ) для чего-то большего. Я предполагаю, что это ускоряет работу для меньших значений, избегая при этом переполнений с плавным переходом на bignums.
Ответ 4
Интересно. В моем 64-битном (i7 Ubuntu) поле:
>>> print type(0x7FFFFFFF)
<type 'int'>
>>> print type(0x7FFFFFFF+1)
<type 'int'>
Угадайте, что на более крупной машине работает до 64 бит.
Ответ 5
Python 2.7.9 автоматически продвигает номера.
Для случая, когда вы не знаете, использовать int() или long().
>>> a = int("123")
>>> type(a)
<type 'int'>
>>> a = int("111111111111111111111111111111111111111111111111111")
>>> type(a)
<type 'long'>
Ответ 6
Python 2 автоматически устанавливает тип в зависимости от размера значения. Руководство по максимальным значениям можно найти ниже.
Максимальное значение Int по умолчанию в Python 2 равно 65535, все, что выше, будет длинным
Например:
>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>
В Python 3 длинный тип данных был удален, и все целочисленные значения обрабатываются классом Int. Размер Int по умолчанию будет зависеть от архитектуры вашего процессора.
Например:
- 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 автоматически изменит его тип и выделит больше памяти для обработки этого увеличения значений min/max. Если в Python 2 он конвертировался в 'long', то теперь он просто конвертировался в следующий размер Int.
Пример. Если вы используете 32-разрядную операционную систему, максимальное значение Int по умолчанию будет 2147483647. Если назначено значение 2147483648 или более, тип изменится на Int64.
Существуют разные способы проверки размера int и его выделения памяти. Примечание: в Python 3 использование встроенного метода type() всегда будет возвращать <class 'int'>
независимо от того, какой размер Int вы используете.
Ответ 7
Из python 3.x унифицированные целочисленные libries являются еще более умными, чем более старые версии. В моем (i7 Ubuntu) я получил следующее:
>>> type(math.factorial(30))
<class 'int'>
Для деталей реализации обратитесь к файлам Include/longintrepr.h, Objects/longobject.c and Modules/mathmodule.c
. Последний файл представляет собой динамический модуль (скомпилированный таким файлом). Код хорошо прокомментирован, чтобы следовать.
Ответ 8
Он управляет ими, потому что int
и long
- определения класса брата. У них есть соответствующие методы для +, -, *,/и т.д., Которые будут давать результаты соответствующего класса.
Например
>>> a=1<<30
>>> type(a)
<type 'int'>
>>> b=a*2
>>> type(b)
<type 'long'>
В этом случае класс int
имеет метод __mul__
(тот, который реализует *), который при необходимости создает результат long
.
Ответ 9
Просто чтобы продолжить все ответы, которые были даны здесь, особенно @James Lanes
размер целочисленного типа может быть выражен этой формулой:
общий диапазон = (2-битная система)
нижний предел = - (2 ^ битная система) * 0,5 верхний предел = ((2 ^ битная система) * 0,5) - 1
Ответ 10
Начиная с Python 3.x все целочисленные значения являются частью класса Int. Размер целых чисел теперь зависит от архитектуры процессора. ![enter image description here]()