import psutil from time import time def timed(fn): def decorated(*x): start = time() result = fn(*x) print("Executing %s took %d ms" % (fn.__name__, (time()-start)*1000)) return result return decorated @tim
Давайте рассмотрим код построчно и проанализируем его.
1. **Импорт необходимых библиотек**:
```python
import psutil
from time import time
```
Здесь мы импортируем библиотеку `psutil`, которая предоставляет информацию о системе, включая загрузку CPU, и функцию `time` из модуля `time` для получения текущего времени.
2. **Определение декоратора**:
```python
def timed(fn):
def decorated(*x):
start = time()
result = fn(*x)
print("Executing %s took %d ms" % (fn.__name__, (time()-start)*1000))
return result
return decorated
```
Мы определяем декоратор `timed`, который принимает функцию `fn`. Внутри `timed` определена вложенная функция `decorated`, которая будет выполнена вместо оригинальной функции. В ней:
- Сохраняется текущая метка времени (`start`).
- Вызывается оригинальная функция `fn` и сохраняется её результат.
- После выполнения функции вычисляется время, затраченное на её выполнение, и выводится на экран.
- Наконец, возвращается результат оригинальной функции.
3. **Использование декоратора**:
```python
@timed
def cpuload():
load = psutil.cpu_percent()
print("cpuload() returns %d" % load)
return load
```
Здесь мы используем декоратор `timed` для функции `cpuload`. Это означает, что при вызове `cpuload`, вместо выполнения самой функции, будет выполнена функция `decorated` из декоратора. Функция `cpuload` измеряет загрузку процессора с помощью `psutil.cpu_percent()` и возвращает её.
4. **Вывод имени функции**:
```python
print ("cpuload.__name__==" + cpuload.__name__)
```
Здесь выводится имя функции `cpuload`. Однако, после применения декоратора, оно будет равно `'decorated'`, а не `'cpuload'`.
5. **Вызов функции и вывод результата**:
```python
print ("CPU load is %d%%" % cpuload())
```
В этом месте происходит вызов функции `cpuload`, и результат её выполнения (загрузка процессора) выводится на экран.
### Почему это параметрический декоратор?
На самом деле, представленный декоратор `timed` не является параметрическим декоратором. Параметрический декоратор — это декоратор, который принимает аргументы. Например:
```python
def repeat(num_times):
def decorator_repeat(fn):
def wrapper(*args, **kwargs):
for _ in range(num_times):
result = fn(*args, **kwargs)
return result
return wrapper
return decorator_repeat
```
В вашем случае декоратор `timed` не принимает никаких дополнительных аргументов, поэтому он не является параметрическим. Он просто оборачивает функцию `fn` и добавляет функциональность измерения времени выполнения.