Python таймер декоратор - функция вступает в силу на исходный набор данных, который я положил в аргументы - PullRequest
0 голосов
/ 27 февраля 2019

Я относительно новичок в Python Decorator.

У меня есть эта функция декоратора.

def myTimer(func):
    def wrapper(*args, **kargs):
      t1 = time.time()
      result = func(*args, **kargs)
      t2 = time.time() - t1
      print('Execution Time (function : {}) : {} sec'.format(func.__name__, t2))
      return result

    return wrapper

Это просто функция таймера.И у меня есть метод, который добавляет столбец на основе других столбцов.

@myTimer
def createID(dat):
    dat['new'] = dat.apply(lambda x: '_'.join(map(str, x[4:8])), axis = 1)
    return dat

Создается новый столбец, значения которого являются просто значениями другого столбца, объединенными разделителем '_'.

Теперь, если я определю две функции выше и запускаю ниже,

tdat2 = createID(tdat)

И тогда tdat2 вернётся правильно, но изменение вступит в силу и для tdat (исходный набор данных).Я имею в виду, что во-первых, у tdat есть 30 столбцов, а у tdat2 должно быть 31 столбец, и это хорошо, но у tdat также есть новый столбец.

Есть ли способ исправить это?Я попробовал ниже, и это работает отлично для меня, но я хочу, чтобы аргумент и возвращаемые значения были одинаковыми ('dat') из-за соглашения кода и т. Д.

@myTimer
def createID2(dat):
    result = dat.copy()
    result['new'] = result.apply(lambda x: '_'.join(map(str, x[4:8])), axis = 1)
    return result

Заранее спасибо.

1 Ответ

0 голосов
/ 27 февраля 2019

Некоторые заметки

  1. Поскольку у вас нет класса, createID называется функцией.Это черный ящик: он принимает входные данные, что-то делает и возвращает выходные данные.В Python функции записываются в нижнем регистре с подчеркиванием, например, create_id.
  2. my_timer() также является функцией, которая упаковывает декорируемую ею функцию, т.е. create_id().Ваш декоратор на самом деле ничего не делает с вашей упакованной функцией, за исключением того, что что-то печатает (побочный эффект).

Так что все, что происходит внутри декорированной функции, не зависит от вашего декоратора.Все, что он делает, это время, как быстро выполняется вызов функции.


Проблема мутации, которую вы описываете, является проблемой панд (см. Документы по View vs Copy ).Вы решили это методом .copy().

...