Списки та Масиви NumPy
Вибір правильної структури даних може суттєво вплинути як на швидкість, так і на використання пам’яті. Спочатку розглянемо списки та порівняємо їх із масивами NumPy, щоб зрозуміти, коли і як ефективно використовувати ці структури даних.
Список
list — один із найпоширеніших типів даних. Він функціонує як динамічний масив, тобто його розмір може збільшуватися або зменшуватися за потреби. Списки універсальні, забезпечують ефективний доступ і зміну елементів за довільними індексами. Однак операції, такі як вставка або видалення елементів, а також пошук елемента (перевірка наявності), можуть бути повільними для великих списків. Винятком є вставка або видалення в кінці списку, які залишаються ефективними незалежно від розміру списку.
Списки доцільно використовувати у таких випадках:
- Потрібні впорядковані дані;
- Часто здійснюється доступ або зміна елементів за індексом;
- Необхідно зберігати різні типи даних (наприклад, цілі числа, рядки або користувацькі об’єкти);
- Не потрібна швидка перевірка наявності елемента або швидка вставка чи видалення з середини списку.
123456789101112131415my_list = [10, 20, 30] # Access an element by index print(my_list[1]) # Modify an element at a specific index my_list[1] = 50 print(my_list) # Insert an element at the end of the list my_list.append(40) print(my_list) # Remove an element from the end of the list my_list.pop() print(my_list)
Масив NumPy
Хоча списки є універсальними, вони не є найбільш ефективними для масштабних числових операцій. У таких випадках використовуються масиви NumPy.
Масиви NumPy реалізовані на C, що робить їх значно швидшими за списки для числових операцій. Однією з ключових переваг є векторизація, яка дозволяє виконувати операції над цілими масивами одночасно, без необхідності явних циклів. Це забезпечує суттєве підвищення продуктивності, особливо при роботі з великими наборами даних.
Розглянемо приклад піднесення до квадрату кожного елемента у списку (за допомогою циклу for у list comprehension) та у масиві NumPy (за допомогою векторизації):
1234567891011121314151617181920import numpy as np import os os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator my_list = list(range(1, 100001)) arr = np.array(my_list) @timeit_decorator(number=100) def square_list(numbers_list): return [x ** 2 for x in numbers_list] @timeit_decorator(number=100) def square_array(numbers_array): return numbers_array ** 2 sqaures_list = square_list(my_list) squares_array = square_array(arr) if np.array_equal(squares_array, sqaures_list): print('The array is equal to the list')
Як видно, перевага продуктивності масивів NumPy є досить очевидною.
Під час роботи з числовими даними масиви NumPy забезпечують перевагу у використанні пам'яті порівняно зі списками. Вони зберігають реальні дані у суміжних блоках пам'яті, що робить їх ефективнішими, особливо для великих наборів даних. Оскільки масиви NumPy є однорідними (один тип даних), вони уникають додаткових витрат на посилання на об'єкти.
На відміну від цього, списки є різнорідними, зберігаючи посилання на об'єкти у суміжній пам'яті, а самі об'єкти розташовані в інших місцях. Така гнучкість призводить до додаткових витрат пам'яті при роботі з числовими даними.
Підсумовуючи, у наступній таблиці порівнюються списки та масиви NumPy:
1. Ви розробляєте програму для керування колекцією об'єктів Sensor (користувацький клас), кожен з яких містить timestamp (рядок) та reading (float). Набір даних буде зростати з часом, і часто потрібно оновлювати окремі показники датчиків. Яка структура даних буде найкращим вибором?
2. Ви працюєте з великим числовим набором даних для проєкту машинного навчання. Яка структура даних забезпечить найефективнішу продуктивність для цього завдання?
3. Ви аналізуєте дані фондового ринку, які складаються з числових значень (цін) у часі. Необхідно виконувати швидкі обчислення, такі як знаходження середньої ціни та застосування математичних перетворень до даних. Яку структуру даних ви оберете?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Awesome!
Completion rate improved to 7.69
Списки та Масиви NumPy
Свайпніть щоб показати меню
Вибір правильної структури даних може суттєво вплинути як на швидкість, так і на використання пам’яті. Спочатку розглянемо списки та порівняємо їх із масивами NumPy, щоб зрозуміти, коли і як ефективно використовувати ці структури даних.
Список
list — один із найпоширеніших типів даних. Він функціонує як динамічний масив, тобто його розмір може збільшуватися або зменшуватися за потреби. Списки універсальні, забезпечують ефективний доступ і зміну елементів за довільними індексами. Однак операції, такі як вставка або видалення елементів, а також пошук елемента (перевірка наявності), можуть бути повільними для великих списків. Винятком є вставка або видалення в кінці списку, які залишаються ефективними незалежно від розміру списку.
Списки доцільно використовувати у таких випадках:
- Потрібні впорядковані дані;
- Часто здійснюється доступ або зміна елементів за індексом;
- Необхідно зберігати різні типи даних (наприклад, цілі числа, рядки або користувацькі об’єкти);
- Не потрібна швидка перевірка наявності елемента або швидка вставка чи видалення з середини списку.
123456789101112131415my_list = [10, 20, 30] # Access an element by index print(my_list[1]) # Modify an element at a specific index my_list[1] = 50 print(my_list) # Insert an element at the end of the list my_list.append(40) print(my_list) # Remove an element from the end of the list my_list.pop() print(my_list)
Масив NumPy
Хоча списки є універсальними, вони не є найбільш ефективними для масштабних числових операцій. У таких випадках використовуються масиви NumPy.
Масиви NumPy реалізовані на C, що робить їх значно швидшими за списки для числових операцій. Однією з ключових переваг є векторизація, яка дозволяє виконувати операції над цілими масивами одночасно, без необхідності явних циклів. Це забезпечує суттєве підвищення продуктивності, особливо при роботі з великими наборами даних.
Розглянемо приклад піднесення до квадрату кожного елемента у списку (за допомогою циклу for у list comprehension) та у масиві NumPy (за допомогою векторизації):
1234567891011121314151617181920import numpy as np import os os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator my_list = list(range(1, 100001)) arr = np.array(my_list) @timeit_decorator(number=100) def square_list(numbers_list): return [x ** 2 for x in numbers_list] @timeit_decorator(number=100) def square_array(numbers_array): return numbers_array ** 2 sqaures_list = square_list(my_list) squares_array = square_array(arr) if np.array_equal(squares_array, sqaures_list): print('The array is equal to the list')
Як видно, перевага продуктивності масивів NumPy є досить очевидною.
Під час роботи з числовими даними масиви NumPy забезпечують перевагу у використанні пам'яті порівняно зі списками. Вони зберігають реальні дані у суміжних блоках пам'яті, що робить їх ефективнішими, особливо для великих наборів даних. Оскільки масиви NumPy є однорідними (один тип даних), вони уникають додаткових витрат на посилання на об'єкти.
На відміну від цього, списки є різнорідними, зберігаючи посилання на об'єкти у суміжній пам'яті, а самі об'єкти розташовані в інших місцях. Така гнучкість призводить до додаткових витрат пам'яті при роботі з числовими даними.
Підсумовуючи, у наступній таблиці порівнюються списки та масиви NumPy:
1. Ви розробляєте програму для керування колекцією об'єктів Sensor (користувацький клас), кожен з яких містить timestamp (рядок) та reading (float). Набір даних буде зростати з часом, і часто потрібно оновлювати окремі показники датчиків. Яка структура даних буде найкращим вибором?
2. Ви працюєте з великим числовим набором даних для проєкту машинного навчання. Яка структура даних забезпечить найефективнішу продуктивність для цього завдання?
3. Ви аналізуєте дані фондового ринку, які складаються з числових значень (цін) у часі. Необхідно виконувати швидкі обчислення, такі як знаходження середньої ціни та застосування математичних перетворень до даних. Яку структуру даних ви оберете?
Дякуємо за ваш відгук!