Python Обратные слова производительности - PullRequest
0 голосов
/ 14 декабря 2018

Я пытался изменить слова в Python.Простая задача (leetcode).

Решение 1 : (20 мс - 99,54% процентиль)

words = reversed([word.strip() for word in words if word != ''])

answer = " ".join(words).strip()

Решение 2 : (24 мс - процентиль 48%)

words = [word.strip() for word in words if word != '']

answer = " ".join(reversed(words)).strip()

Я пытаюсь найти причину этого отклонения?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Единственная разница здесь заключается в том, что ссылки на временную list отбрасываются (во время join в первом случае, а не до выхода из функции во втором случае).Но это вряд ли имеет значение, если временная структура не нарушена каким-либо образом (она должна включать в себя любое время очистки в обоих случаях).

В противном случае, если исключить какой-либо альтернативный интерпретатор со странным поведением, оба набора кода должныведут себя одинаково (коды операций идентичны, за исключением замены порядка в зависимости от того, сохраняется ли list первым или вызывается сначала reversed);временные различия кажутся более случайными, чем что-либо еще.

0 голосов
/ 14 декабря 2018

Запустите тестирование, используя timeit (https://docs.python.org/3.7/library/timeit.html), чтобы увидеть, что время более или менее одинаково (для моей предполагаемой входной выборки):

def opt1(words):
  words = reversed([word.strip() for word in words if word != ''])
  answer = " ".join(words).strip()
  return answer

def opt2(words):
  words = [word.strip() for word in words if word != '']
  answer = " ".join(reversed(words)).strip()
  return answer

import timeit, functools

t_opt1 = timeit.Timer(functools.partial(opt1, words))
t_opt2 = timeit.Timer(functools.partial(opt2, words))
# run 5000 times each method:
print('opt1: ', t_opt1.timeit(5000))
print('opt2: ', t_opt2.timeit(5000))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...