Как Python управляет int и long? - PullRequest
       20

Как Python управляет int и long?

98 голосов
/ 20 января 2010

Кто-нибудь знает, как Python управляет внутренним типом 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'>

Ответы [ 10 ]

104 голосов
/ 21 января 2010

int и long были "объединены" несколько версий назад . До этого можно было переполнить int через математические операции.

3.x еще более продвинулись в этом, полностью исключив int и имея только long.

  • Python 2 : sys.maxint содержит максимальное значение, которое может содержать Python int.
    • В 64-битном Python 2.7 размер составляет 24 байта. Проверьте с sys.getsizeof().
  • Python 3 : sys.maxsize содержит максимальный размер в байтах, которым может быть Python int.
    • Это будут гигабайты в 32 битах и ​​эксабайты в 64 битах.
    • Такое большое значение типа int будет иметь значение, аналогичное степени 8 sys.maxsize.
15 голосов
/ 21 января 2010

Это PEP должно помочь.

Суть в том, что вам не стоит беспокоиться об этом в версиях Python> 2.4

4 голосов
/ 17 февраля 2017

Python 2.7.9 автоматически продвигает числа. Для случая, когда не уверены использовать int () или long ().

>>> a = int("123")
>>> type(a)
<type 'int'>
>>> a = int("111111111111111111111111111111111111111111111111111")
>>> type(a)
<type 'long'>
4 голосов
/ 22 февраля 2011

Интересно. На моей 64-битной (i7 Ubuntu) коробке:

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

Угадайте, что на большей машине он достигает 64-битных целых.

4 голосов
/ 21 января 2010

На моей машине:

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

Python использует целые числа (32-битные целые числа со знаком, я не знаю, являются ли они C-целыми или нет) для значений, которые вписываются в 32-битные, но автоматически переключается на long (произвольно большое количество битов - т.е. bignums) ) для чего-то большего. Я предполагаю, что это ускоряет работу для меньших значений, избегая при этом любых переполнений с плавным переходом к bignums.

2 голосов
/ 05 сентября 2018

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 вы используете.

1 голос
/ 23 июля 2016

В python 3.x объединенные целочисленные библиотеки еще умнее, чем в старых версиях На моем (i7 Ubuntu) я получил следующее:

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

Подробнее о реализации см. Include/longintrepr.h, Objects/longobject.c and Modules/mathmodule.c файлы. Последний файл представляет собой динамический модуль (скомпилированный в файл so). Код хорошо прокомментирован, чтобы следовать.

0 голосов
/ 03 мая 2019

В Python 3.x все целочисленные значения являются частью класса Int.Размер целых чисел теперь зависит от архитектуры процессора.enter image description here

0 голосов
/ 16 ноября 2018

Просто чтобы продолжить все ответы, которые были даны здесь, особенно @James Lanes

размер целочисленного типа можно выразить по следующей формуле:

общий диапазон = (2 ^ битная система)

нижний предел = - (2 ^ битная система) * 0,5 верхний предел = ((2 ^ битная система) * 0,5) - 1

0 голосов
/ 21 января 2010

Он управляет ими, потому что int и long являются определениями родственных классов. У них есть соответствующие методы для +, -, *, / и т. Д., Которые приведут к результатам соответствующего класса.

Например

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

В этом случае класс int имеет метод __mul__ (тот, который реализует *), который создает результат long при необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...