Новости

Viewing posts for the category habrahabr

Зачем писать свой React Data Grid в 2019

https://habr.com/ru/post/457504/
  • Разработка веб-сайтов
  • JavaScript
  • ReactJS


Привет, Хабр! Я участвую в разработке ECM системы. И в небольшом цикле статей хочу поделится нашим опытом и историей разработки своего React Data Grid (далее просто грид), а именно:

Создание 3-уровневого меню с помощью фреймворка Htmlix — часть 2 мобильная версия меню

https://habr.com/ru/post/457520/
  • JavaScript
  • Программирование

Книга "{Вы не знаете JS} Типы и грамматические конструкции"

https://habr.com/ru/company/piter/blog/456730/
  • Блог компании Издательский дом «Питер»
  • JavaScript
  • Профессиональная литература

Мои «Ого, я этого не знал!» моменты с Jest

https://habr.com/ru/company/otus/blog/457616/
  • Блог компании OTUS. Онлайн-образование
  • JavaScript
  • Программирование

Реализация целого типа в CPython

https://habr.com/ru/post/455114/
  • Python
  • Программирование


На Хабре уже были статьи о подробностях реализации менеджера памяти CPython, Pandas, я написал статью про реализацию словаря.

Казалось бы, что можно написать про обычный целочисленный тип? Однако тут не всё так просто и целочисленный тип не такой уж и очевидный.

Если вам интересно, почему x * 2 быстрее x << 1.

И как провернуть следующий трюк:

>>> 42 == 4
True
>>> 42
4
>>> 1 + 41
4

То вам стоит ознакомиться с данной статьёй.

В python нет примитивных типов — все переменные представляют собой объекты и размещаются в динамической памяти. При этом целые числа представлены только одним типом (decimal мы не рассматриваем) — PyLongObject. Реализация и объявления которого лежат в файлах longobject.h, longintrepr.h и longobject.c.

struct _longobject {
    PyObject_VAR_HEAD   //  стандартный заголовок для объектов переменной длины
    digit ob_digit[1];  //  массив чисел
};

В любой объект в CPython входят два поля: ob_refcnt — счётчик ссылок на объект и ob_type — указатель на тип объекта, к объектам, которые могут менять свою длину, добавляется поле ob_size — текущий аллоцированный размер (используемый может быть меньше).

Таким образом целочисленный тип представлен массивом переменной длины из отдельных разрядов (digit), поэтому python из коробки поддерживает длинную арифметику, во второй версии языка был отдельный тип «обычных» целых.«Длинные» целые создавались с помощью литера L или, если результат операций с ними вызывал переполнение, в третьей версии от него было решено отказаться.

    # python2
    num1 = 42
    print num1, type(num1)  # 42 <type 'int'>
    num2 = 42L
    print num2, type(num2)  # 42 <type 'long'>
    num3 = 2 ** 100
    print num3, type(num3)  # 1267650600228229401496703205376 <type 'long'>

Целое значение, хранимое структурой _longobject оказывается равно:

$\sum_{i=0}^{abs(ob\_size)-1}{ob\_digit_i * 2 ^{SHIFT * i}}$

Recent Posts

Archive

2019
2018
2017
2016
2015
2014

Categories

Authors

Feeds

RSS / Atom