Як Python керує int та long?


118

Хтось знає, як Python керує внутрішніми та довгими типами?

  • Чи вибирає правильний тип динамічно?
  • Яка межа для 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'>

Чи не просто вони відображають типи stdc на льоту під нижньою точкою в CPython?
Ейден Белл

Так, я думаю, що вони роблять. Я також підозрюю, що все виділено на купі, тому коли число потребує більшої точності, вони просто reallocвсе в порядку. Але я не зовсім впевнений, тому відповідь залишу комусь іншому.
zneak

2
Ви також можете змусити python використовувати довгу змінну зvar = 666L
qba

8
@Ignacio: WRONG CPython int- це C long(за замовчуванням підписано) ... див . <CPython 2.X source>/Include/intobject.h: typedef structure {PyObject_HEAD long ob_ival; } PyIntObject; У будь-якому випадку Python 2.x intдозволяє від'ємні числа; а С unsignedпросто не впорається.
Джон Махін

PEP 237 обговорює, як під капотом Python мається на увазі зробити все це, здавалося б, однаковим.
Карел

Відповіді:


124

intі longбули "уніфіковані" кілька версій назад . До цього можна було переповнювати int через математичний ops.

3.x надалі розширив це, вилучивши довго і маючи лише int.

  • Python 2 : sys.maxintмістить максимальне значення, яке може містити int Python.
    • На 64-бітному Python 2.7 розмір становить 24 байти. Перевірте sys.getsizeof().
  • Python 3 : sys.maxsizeмістить максимальний розмір у байтах, яким може бути int Python.
    • Це буде гігабайт у 32 бітах, а екзабайт у 64 біт.
    • Такий великий int мав би значення, подібне до сили 8 sys.maxsize.

30
Але Python3 називає цей тип "int", навіть якщо він поводиться більше, ніж 2.x "довгий".

3
Коментар Теда: Як було сказано нижче, будьте уважні, що передавання чогось до int, що перевищує maxint, все одно призведе до довгого >>> типу (int (sys.maxint + 1)) <type 'long'>
StuartLC

2
sys.maxint дасть вам найбільше 64-бітове ціле число (на моїй 64-бітній машині). Long може бути набагато більшим, ніж 64-біт, просто спробуйте "sys.maxint << 1000000"
fccoelho

4
У python3 це sys.maxsize
pylover

3
sys.maxsize не має нічого спільного з цілими числами. Sys.maxint Python 3 видалено, оскільки не існує максимального розміру для цілого числа (Python 3 int- такий самий, як і Python 2 long).
asmeurer

19

Цей ПЕП повинен допомогти.

Підсумок полягає в тому, що вам дійсно не доведеться турбуватися про це у версіях python> 2.4


15
Ви повинні турбуватися з цього приводу, якщо вам доведеться викликати функцію int в c тим, що не впишеться в int (тобто довге). Жодна кількість кастингу long-> int не допоможе. Сталося зі мною зовсім недавно.
Макке

1
@Macke: Цей коментар мене врятував, я припускав, що int зробить трюк, і мені було цікаво, чому я все ще отримую виключення Jython.
Тед

@Macke Абсолютно правда. У компанії, в якій я зараз працюю, у нас є симулятор, написаний на Python, який здійснює введення користувача через записи Tkinter та надсилає запрошені значення через TCP / IP клієнту (написаному на C / C ++), що імітує вбудовану систему. Уявіть, що станеться, коли ви вставите 100000000000000000000000 у запис на базі Python ...: P
rbaleksandar

@Mackie добре, якщо ви насправді переймалися читанням PEP, він прямо говорить: API API залишається незмінним; Код C все одно повинен знати про різницю між короткими та довгими входами. (API Python 3.0 C API, ймовірно, буде абсолютно несумісним.) API PyArg_Parse * () вже приймає довгі вставки, якщо вони знаходяться в діапазоні, представленому C ints або longs, так що функції, що приймають C int або довгий аргумент, вигравали ' мені не доведеться турбуватися про стосунки з Python.
коуберт

4

На моїй машині:

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

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


4

Цікаво. У моєму 64-розрядному (i7 Ubuntu) вікні:

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

Здогадайтесь, він набирає до 64 бітових точок на більшій машині.


2
Python використовує більш великий цілий тип, доступний для машини. Так зазвичай на 32-бітних машинах int матиме розмір 32 біт, тоді як на 64-бітних машинах він матиме розмір 64 біт. Але можуть бути 32-бітні архітектури, що визначають 64-бітні цілі числа, у цьому випадку python використовує 64-бітове ціле число.
Бакуріу

4

Python 2.7.9 автоматично просуває номери. У випадку, коли ви не впевнені в застосуванні int () або long ().

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

4

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 він перетворився б на "довгий", тепер він просто перетворюється на наступний розмір Int.

Приклад: Якщо ви використовуєте 32-бітну операційну систему, максимальне значення Int за замовчуванням буде 2147483647. Якщо буде призначено значення 2147483648 або більше, тип буде змінено на Int64.

Існують різні способи перевірити розмір int та його розподіл пам'яті. Примітка. У Python 3 використання вбудованого типу type () завжди буде повертатися <class 'int'>незалежно від того, який розмір Int ви використовуєте.


1

З python 3.x, уніфіковані цілі лібрики ще розумніші, ніж у старих версіях. У своєму вікні (i7 Ubuntu) я отримав таке,

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

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


1

Просто для продовження всіх відповідей, які були дані тут, особливо @James Lanes

розмір цілого типу може бути виражений за допомогою цієї формули:

загальний діапазон = (2 ^ бітова система)

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


0

Він управляє ними, тому що intіlong є визначеннями класу братів сестер. Вони мають відповідні методи для +, -, *, / тощо, які дадуть результати відповідного класу.

Наприклад

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

У цьому випадку клас int має __mul__метод (той, який реалізує *), який створює longрезультат при необхідності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.