【问题标题】:Python Reverse words performancePython 逆向词性能
【发布时间】:2018-12-14 11:42:37
【问题描述】:

我试图在 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()

我正在尝试找出这种差异的原因?

【问题讨论】:

  • 您运行每个解决方案的频率如何?
  • 能否提供预期的输入输出
  • 什么是“百分比”值,它们来自哪里,与 leetcode 中的位置有关?正如其他人所说,这只是正常的差异,例如线程调度、GC、施加 RAM/缓存压力的后台作业、CPU 节流……
  • 示例输入:'a b c' 示例输出:'c b a' 当 leet 代码多次运行此代码并计算性能时,百分位数即将到来。

标签: python string performance


【解决方案1】:

使用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))

【讨论】:

    【解决方案2】:

    这里唯一的区别是对临时list 的引用何时被丢弃(在第一种情况下join 期间,直到第二种情况下的函数退出)。但这不太重要,除非时间框架以某种方式被破坏(它应该包含两种情况下的任何清理时间)。

    否则,除非一些替代解释器涉及奇怪的行为,否则两组代码的行为应该相同(操作码是相同的,除了根据是先存储list还是调用reversed来交换顺序第一的);时间差异似乎比其他任何事情都更可能是随机的。

    【讨论】:

      猜你喜欢
      • 2010-12-06
      • 2016-06-26
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      相关资源
      最近更新 更多