Как 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