home.social

#оптимізація — Public Fediverse posts

Live and recent posts from across the Fediverse tagged #оптимізація, aggregated by home.social.

  1. CW: Оптимізація Python класів

    Створимо простенький клас з двома полями цілих чисел.

    class A:
        x: int
        y: int
        def __init__(self, x, y):
            self.x, self.y = x, y
    

    Тепер перевіримо його розмір

    >>> import sys
    >>> sys.getsizeof(A)
    1712
    >>> sys.getsizeof(A(3,4))
    48
    

    getsizeof повертає значення у байтах.

    А тепер клас B з тими ж полями, але з додатковою вказівкою.

    class B:
        x: int
        y: int
        __slots__ = ("x", "y")
        def __init__(self, x, y):
            self.x, self.y = x, y
    
    >>> sys.getsizeof(B)
    944
    >>> sys.getsizeof(B(3,4))
    48
    

    Тепер можемо порівняти розміри цих класів

    >>> sys.getsizeof(A) - sys.getsizeof(B)
    768
    

    Клас B менший за A на 768 байтів через те що клас B не має атрибута __dict__.

    #python #class #slots #оптимізація #класи #пам'ять

  2. CW: Оптимізація Python класів

    Створимо простенький клас з двома полями цілих чисел.

    class A:
        x: int
        y: int
        def __init__(self, x, y):
            self.x, self.y = x, y
    

    Тепер перевіримо його розмір

    >>> import sys
    >>> sys.getsizeof(A)
    1712
    >>> sys.getsizeof(A(3,4))
    48
    

    getsizeof повертає значення у байтах.

    А тепер клас B з тими ж полями, але з додатковою вказівкою.

    class B:
        x: int
        y: int
        __slots__ = ("x", "y")
        def __init__(self, x, y):
            self.x, self.y = x, y
    
    >>> sys.getsizeof(B)
    944
    >>> sys.getsizeof(B(3,4))
    48
    

    Тепер можемо порівняти розміри цих класів

    >>> sys.getsizeof(A) - sys.getsizeof(B)
    768
    

    Клас B менший за A на 768 байтів через те що клас B не має атрибута __dict__.

    #python #class #slots #оптимізація #класи #пам'ять

  3. CW: Оптимізація Python класів

    Створимо простенький клас з двома полями цілих чисел.

    class A:
        x: int
        y: int
        def __init__(self, x, y):
            self.x, self.y = x, y
    

    Тепер перевіримо його розмір

    >>> import sys
    >>> sys.getsizeof(A)
    1712
    >>> sys.getsizeof(A(3,4))
    48
    

    getsizeof повертає значення у байтах.

    А тепер клас B з тими ж полями, але з додатковою вказівкою.

    class B:
        x: int
        y: int
        __slots__ = ("x", "y")
        def __init__(self, x, y):
            self.x, self.y = x, y
    
    >>> sys.getsizeof(B)
    944
    >>> sys.getsizeof(B(3,4))
    48
    

    Тепер можемо порівняти розміри цих класів

    >>> sys.getsizeof(A) - sys.getsizeof(B)
    768
    

    Клас B менший за A на 768 байтів через те що клас B не має атрибута __dict__.

    #python #class #slots #оптимізація #класи #пам'ять

  4. CW: Оптимізація Python класів

    Створимо простенький клас з двома полями цілих чисел.

    class A:
        x: int
        y: int
        def __init__(self, x, y):
            self.x, self.y = x, y
    

    Тепер перевіримо його розмір

    >>> import sys
    >>> sys.getsizeof(A)
    1712
    >>> sys.getsizeof(A(3,4))
    48
    

    getsizeof повертає значення у байтах.

    А тепер клас B з тими ж полями, але з додатковою вказівкою.

    class B:
        x: int
        y: int
        __slots__ = ("x", "y")
        def __init__(self, x, y):
            self.x, self.y = x, y
    
    >>> sys.getsizeof(B)
    944
    >>> sys.getsizeof(B(3,4))
    48
    

    Тепер можемо порівняти розміри цих класів

    >>> sys.getsizeof(A) - sys.getsizeof(B)
    768
    

    Клас B менший за A на 768 байтів через те що клас B не має атрибута __dict__.

    #python #class #slots #оптимізація #класи #пам'ять

  5. CW: Оптимізація Python класів

    Створимо простенький клас з двома полями цілих чисел.

    class A:
        x: int
        y: int
        def __init__(self, x, y):
            self.x, self.y = x, y
    

    Тепер перевіримо його розмір

    >>> import sys
    >>> sys.getsizeof(A)
    1712
    >>> sys.getsizeof(A(3,4))
    48
    

    getsizeof повертає значення у байтах.

    А тепер клас B з тими ж полями, але з додатковою вказівкою.

    class B:
        x: int
        y: int
        __slots__ = ("x", "y")
        def __init__(self, x, y):
            self.x, self.y = x, y
    
    >>> sys.getsizeof(B)
    944
    >>> sys.getsizeof(B(3,4))
    48
    

    Тепер можемо порівняти розміри цих класів

    >>> sys.getsizeof(A) - sys.getsizeof(B)
    768
    

    Клас B менший за A на 768 байтів через те що клас B не має атрибута __dict__.

    #python #class #slots #оптимізація #класи #пам'ять

  6. Як же мене після 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 #оптимізація #бісить

  7. Як же мене після 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 #оптимізація #бісить

  8. Як же мене після 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 #оптимізація #бісить

  9. Як же мене після 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 #оптимізація #бісить

  10. Як же мене після 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 #оптимізація #бісить

  11. Хотів би ще трохи уточнити чому немає різниці в часі виконання програми на Go, і на C++. Для отримання часу виконання програми ми можемо використати, вбудовану в оболонку, командуtime`. І з її виводу ми можемо замітити що більшість часу виконання належить до виконання системи, тобто системним викликам. #cpp #go #time #runtime #sof #sizeof #оптимізація #пришвидшення #час #виконання

  12. Хотів би ще трохи уточнити чому немає різниці в часі виконання програми на Go, і на C++. Для отримання часу виконання програми ми можемо використати, вбудовану в оболонку, командуtime`. І з її виводу ми можемо замітити що більшість часу виконання належить до виконання системи, тобто системним викликам. #cpp #go #time #runtime #sof #sizeof #оптимізація #пришвидшення #час #виконання

  13. Раніше я вже розповідав про скрипт sizeof і його оптимізацію за допомоги переписування з python на Go. Також там я згадував про проблеми з реалізацією на C++. У ній виникали проблеми з каталогами монтування файлових систем. Після того як рішення було знайдено я порівняв швидкість виконання і замітив що її практично немає, але є різниця у розмірі бінарного файлу. Реалізація на Go, у режимі збірки реліз, займає 1,4 MiB, а на C++, також у релізі, 427,0 KiB. Різниця приблизно у три рази менше.

    Після цього я вирішив порівняти старі програми з пакунка coreutils і їхні сучасні альтернативи. Через те що тут не працюють markdown таблиці я вставлю її як зображення.

    Серед цих програм середнє значення множника є 23. Розмір встановленого пакунка coreutils дорівнює 16 MiB. У ньому є 103 бінарники і їхній сумарний розмір дорівнює 5.001 MiB. Якщо ми помножимо це на середній множник, тільки бінарники будуть займати 115 MiB. І це все тільки на прикладі одного пакунка, а що було б якби більшість програм були так зроблені?

    #c #c++ #cpp #go #golang #rusr #rs #coreutils #sizeof #sof #оптимізація #реалізація #ls #lsd #cat #bat #find #fd

  14. Раніше я вже розповідав про скрипт sizeof і його оптимізацію за допомоги переписування з python на Go. Також там я згадував про проблеми з реалізацією на C++. У ній виникали проблеми з каталогами монтування файлових систем. Після того як рішення було знайдено я порівняв швидкість виконання і замітив що її практично немає, але є різниця у розмірі бінарного файлу. Реалізація на Go, у режимі збірки реліз, займає 1,4 MiB, а на C++, також у релізі, 427,0 KiB. Різниця приблизно у три рази менше.

    Після цього я вирішив порівняти старі програми з пакунка coreutils і їхні сучасні альтернативи. Через те що тут не працюють markdown таблиці я вставлю її як зображення.

    Серед цих програм середнє значення множника є 23. Розмір встановленого пакунка coreutils дорівнює 16 MiB. У ньому є 103 бінарники і їхній сумарний розмір дорівнює 5.001 MiB. Якщо ми помножимо це на середній множник, тільки бінарники будуть займати 115 MiB. І це все тільки на прикладі одного пакунка, а що було б якби більшість програм були так зроблені?

    #c #c++ #cpp #go #golang #rusr #rs #coreutils #sizeof #sof #оптимізація #реалізація #ls #lsd #cat #bat #find #fd