Время функции измеряют perf_counter() в декораторе, а отделы отбирают через GROUP BY и HAVING со сравнением со средней зарплатой всех сотрудников. Это две независимые части приведённого условия.
3. Написать простой декоратор, измеряющий время выполнения функции
Время функции измеряют perf_counter() в декораторе, а отделы отбирают через GROUP BY и HAVING со сравнением со средней зарплатой всех сотрудников. Это две независимые части приведённого условия.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
3. Написать простой декоратор, измеряющий время выполнения функции
4. Дано: две таблицы
CREATE TABLE departments (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
department_id INT NOT NULL REFERENCES departments(id),
salary NUMERIC(10,2) NOT NULL
);
Задание:
Напишите запрос, который выводит названия отделов и их среднюю зарплату, но только для тех отделов, где средняя зарплата выше,
чем средняя зарплата по всем сотрудникам компании. Результат отсортируйте по убыванию средней зарплаты.
Ответ
Время функции измеряют perf_counter() в декораторе, а отделы отбирают через GROUP BY и HAVING со сравнением со средней зарплатой всех сотрудников. Это две независимые части приведённого условия.
Синхронный декоратор измеряет и ошибочные вызовы:
from functools import wraps
from time import perf_counter
def timed(func):
@wraps(func)
def wrapper(*args, **kwargs):
started = perf_counter()
try:
return func(*args, **kwargs)
finally:
print(f'{func.__name__}: {perf_counter() - started:.6f}s')
return wrapper
SQL сравнивает с общей средней по людям, а не со средней средних отделов:
SELECT d.name, AVG(e.salary) AS average_salary
FROM departments AS d
JOIN employees AS e ON e.department_id = d.id
GROUP BY d.id, d.name
HAVING AVG(e.salary) > (SELECT AVG(salary) FROM employees)
ORDER BY average_salary DESC;
Для async-функции нужен отдельный async wrapper с await.