Як же мене після C++ навіть на Python тягне оптимізувати там де ніхто не звертає уваги. До прикладу багато хто використовує всюди списки дам де це не потрібно і можна взяти кортеж.
Обʼєкт типу object займає 16 BYTES. Це можна дізнатись викликавши метод __sizeof__ в обʼєкта.
o = object()
o.__sizeof__()
Від цього типу наслідуються всі інші стандартні й не тільки типи навіть якщо явно цього не вказано. Тому це найменший можливий розмір будь-якого обʼєкта. Перевірити це можна за допомоги функції issubclass яка приймає два типи та повертає значення типу bool.
>>> issubclass(int, object)
True
>>> issubclass(float, object)
True
>>> issubclass(bool, object)
True
>>> issubclass(str, object)
True
>>> issubclass(list, object)
True
>>> issubclass(tuple, object)
True
>>> class A:
... pass
...
>>> issubclass(A, object)
True
Саме через це всі обʼєкти мають функцію __sizeof__ і не тільки.
Якщо ми подивимось на розміри стандартних типів, то можемо трохи здивуватись.
>>> int().__sizeof__()
28
>>> float().__sizeof__()
24
>>> bool().__sizeof__()
28
>>> str().__sizeof__()
49
>>> tuple().__sizeof__()
24
>>> list().__sizeof__()
40
>>> set().__sizeof__()
200
>>> dict().__sizeof__()
48
Найбільше я здивувався розміру типу bool. Він займає скільки ж як і int, і є більшим за float та tuple. І це все розміри порожніх (нульових) обʼєктів.
Тепер порівняємо кортежі та списками з однаковим вмістом.
>>> t = (1,2,3,4,5,6)
>>> l = [1,2,3,4,5,6]
>>> t.__sizeof__()
72
>>> l.__sizeof__()
88
Різниця та ж що й при порожніх контейнерах через те що контейнер зберігає тільки посилання на обʼєкт. Можемо в цьому переконатись за id обʼєктів.
>>> id(t[0]) == id(l[0])
True
>>> t[0] is l[0]
True
Оператор is робить те саме, він порівнює ідентифікатори.
Це добре що python оптимізує програму не створюючи зайвих обʼєктів, але всеодно всі обʼєкти займають дуже багато місця. Саме через це я й ненавиджу такі мови як python, js...
#програмування #python #sizeof #розміри #типи #int #float #list #tuple #списки #кортежі #sizeof #object #оптимізація #бісить