Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Максимізація Ефективності Сортування | Підвищення Продуктивності За Допомогою Вбудованих Інструментів
Техніки Оптимізації в Python

bookМаксимізація Ефективності Сортування

Вбудоване сортування

Коли виникає потреба відсортувати список, за винятком рідкісних особливих випадків, майже завжди найкраще використовувати один із двох високоефективних інструментів сортування: функцію sorted() або метод sort(). Обидва реалізовані на C та використовують Timsort — гібридний алгоритм, що поєднує злиття та вставку для підвищення ефективності.

sorted() ідеально підходить для загального сортування, коли потрібно відсортувати будь-який ітерований об'єкт без зміни вихідних даних. Натомість, sort() найкраще підходить для списків, коли допускається зміна на місці.

sorted_list = sorted(some_list)  # Returns a new sorted list
some_list.sort()  # Sorts the list in place

Обидва методи ефективні, але list.sort() може бути лише трохи швидшим для дуже великих списків, оскільки не створює новий список. Однак використовуйте sorted(), якщо потрібно зберегти початковий список незмінним.

Часткове сортування з heapq

У випадках, коли потрібно отримати лише найменші або найбільші елементи з набору даних, повне сортування не є необхідним. Модуль heapq надає ефективні методи, такі як heapq.nsmallest() та heapq.nlargest(), для отримання цих елементів без повного сортування ітерованого об'єкта, що робить процес швидшим і менш ресурсомістким.

Порівняймо продуктивність функції sorted() та функції heapq.nsmallest() для отримання 10 найменших чисел зі списку:

1234567891011121314151617181920212223
import heapq import os decorators = 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 import random # Generate a large list of random integers numbers = [random.randint(1, 1000000) for _ in range(1000000)] @timeit_decorator(number=10) def partial_sort_heapq(): return heapq.nsmallest(10, numbers) @timeit_decorator(number=10) def partial_sort_sorted(): return sorted(numbers)[:10] # Compare performance heapq_result = partial_sort_heapq() sorted_result = partial_sort_sorted() # Ensure both methods give the same result print(heapq_result == sorted_result)
copy

Як видно з нашого прикладу, у даному випадку heapq.nsmallest() приблизно у 10 разів швидший.

Однак, якщо кількість найбільших або найменших елементів (n), які потрібно отримати, наближається до загальної кількості елементів у списку, heapq часто працює повільніше, ніж функція sorted() або метод .sort().

Наприклад, зараз отримаємо 100000 найменших елементів зі списку:

1234567891011121314151617181920212223
import heapq import os decorators = 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 import random # Generate a large list of random integers numbers = [random.randint(1, 1000000) for _ in range(1000000)] @timeit_decorator(number=10) def partial_sort_heapq(): return heapq.nsmallest(100000, numbers) @timeit_decorator(number=10) def partial_sort_sorted(): return sorted(numbers)[:100000] # Compare performance heapq_result = partial_sort_heapq() sorted_result = partial_sort_sorted() # Ensure both methods give the same result print(heapq_result == sorted_result)
copy

У цьому випадку функція sorted() явно перевершує heapq за швидкістю.

1. Потрібно відсортувати цілий список чисел без зміни оригінального списку. Яку функцію/метод сортування слід використовувати?

2. Ви аналізуєте набір даних із 500 000 записів про продажі. Щоб визначити 20 транзакцій з найбільшим доходом, який підхід, ймовірно, буде швидшим і ефективнішим за використанням пам'яті?

question mark

Потрібно відсортувати цілий список чисел без зміни оригінального списку. Яку функцію/метод сортування слід використовувати?

Select the correct answer

question mark

Ви аналізуєте набір даних із 500 000 записів про продажі. Щоб визначити 20 транзакцій з найбільшим доходом, який підхід, ймовірно, буде швидшим і ефективнішим за використанням пам'яті?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 3

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Suggested prompts:

Can you explain why heapq is faster for small n but slower for large n?

When should I use heapq over sorted() in practice?

Are there other efficient ways to partially sort data in Python?

Awesome!

Completion rate improved to 7.69

bookМаксимізація Ефективності Сортування

Свайпніть щоб показати меню

Вбудоване сортування

Коли виникає потреба відсортувати список, за винятком рідкісних особливих випадків, майже завжди найкраще використовувати один із двох високоефективних інструментів сортування: функцію sorted() або метод sort(). Обидва реалізовані на C та використовують Timsort — гібридний алгоритм, що поєднує злиття та вставку для підвищення ефективності.

sorted() ідеально підходить для загального сортування, коли потрібно відсортувати будь-який ітерований об'єкт без зміни вихідних даних. Натомість, sort() найкраще підходить для списків, коли допускається зміна на місці.

sorted_list = sorted(some_list)  # Returns a new sorted list
some_list.sort()  # Sorts the list in place

Обидва методи ефективні, але list.sort() може бути лише трохи швидшим для дуже великих списків, оскільки не створює новий список. Однак використовуйте sorted(), якщо потрібно зберегти початковий список незмінним.

Часткове сортування з heapq

У випадках, коли потрібно отримати лише найменші або найбільші елементи з набору даних, повне сортування не є необхідним. Модуль heapq надає ефективні методи, такі як heapq.nsmallest() та heapq.nlargest(), для отримання цих елементів без повного сортування ітерованого об'єкта, що робить процес швидшим і менш ресурсомістким.

Порівняймо продуктивність функції sorted() та функції heapq.nsmallest() для отримання 10 найменших чисел зі списку:

1234567891011121314151617181920212223
import heapq import os decorators = 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 import random # Generate a large list of random integers numbers = [random.randint(1, 1000000) for _ in range(1000000)] @timeit_decorator(number=10) def partial_sort_heapq(): return heapq.nsmallest(10, numbers) @timeit_decorator(number=10) def partial_sort_sorted(): return sorted(numbers)[:10] # Compare performance heapq_result = partial_sort_heapq() sorted_result = partial_sort_sorted() # Ensure both methods give the same result print(heapq_result == sorted_result)
copy

Як видно з нашого прикладу, у даному випадку heapq.nsmallest() приблизно у 10 разів швидший.

Однак, якщо кількість найбільших або найменших елементів (n), які потрібно отримати, наближається до загальної кількості елементів у списку, heapq часто працює повільніше, ніж функція sorted() або метод .sort().

Наприклад, зараз отримаємо 100000 найменших елементів зі списку:

1234567891011121314151617181920212223
import heapq import os decorators = 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 import random # Generate a large list of random integers numbers = [random.randint(1, 1000000) for _ in range(1000000)] @timeit_decorator(number=10) def partial_sort_heapq(): return heapq.nsmallest(100000, numbers) @timeit_decorator(number=10) def partial_sort_sorted(): return sorted(numbers)[:100000] # Compare performance heapq_result = partial_sort_heapq() sorted_result = partial_sort_sorted() # Ensure both methods give the same result print(heapq_result == sorted_result)
copy

У цьому випадку функція sorted() явно перевершує heapq за швидкістю.

1. Потрібно відсортувати цілий список чисел без зміни оригінального списку. Яку функцію/метод сортування слід використовувати?

2. Ви аналізуєте набір даних із 500 000 записів про продажі. Щоб визначити 20 транзакцій з найбільшим доходом, який підхід, ймовірно, буде швидшим і ефективнішим за використанням пам'яті?

question mark

Потрібно відсортувати цілий список чисел без зміни оригінального списку. Яку функцію/метод сортування слід використовувати?

Select the correct answer

question mark

Ви аналізуєте набір даних із 500 000 записів про продажі. Щоб визначити 20 транзакцій з найбільшим доходом, який підхід, ймовірно, буде швидшим і ефективнішим за використанням пам'яті?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 3
some-alt