【问题标题】:Python3: what are faster, nested function calls or if statements (try/excepts are pretty fast)Python3:什么是更快的嵌套函数调用或 if 语句(try/excepts 非常快)
【发布时间】:2020-10-19 01:48:19
【问题描述】:

在 python3 中,假设我遇到了需要整数的情况。做类似的事情会更快吗

processed_number = int(round(float(some_input)))

或者我应该这样做:

if some_input is int:
    processed_number = some_input
else:
    processed_number = int(round(float(some_input)))

或许

try:
    some_statement_taht_needs_int(some_input)
# except TypeError:
#    processed_number = int(round(float(some_input)))
#    some_statement_taht_needs_int(some_input)
# Apparently, it's better to cut down on exception handling: I might handle something the wrong way
except ValueError:
    # The same thing
    processed_number = int(round(float(some_input)))
    some_statement_taht_needs_int(some_input)

如果这是一个愚蠢的问题,我很抱歉因为两者都使用函数调用。我只是想知道每种方法之间是否存在显着时间差。 我知道我不应该过多地优化 python 代码,但这只是我长期以来的一个问题(可能是一个愚蠢的问题)。如果这很愚蠢,请不要烧毁我。


我并没有真正编写需要这种优化的代码(目前);这只是一个问题,所以我可以在未来改进我的代码。

【问题讨论】:

  • 这真的取决于 1) 你的情况是什么,2) 你多久会出错。如果除特殊情况(数据或服务器故障)外您不希望出错,try-except 会更快。如果您将其用作流量控制机制,那不是一个好主意。
  • 如果我将它用于预处理输入(例如定义函数或定义对象/类时)会怎样
  • 您实际上是在询问两种常用的方法:EAFP 和 LBYL。答案是......这取决于您的代码和您的情况。这是关于同一主题的讨论,但针对 Java:stackoverflow.com/questions/404795/lbyl-vs-eafp-in-javaFWIW 我不一定同意那里接受的答案中的观点,但这由你来判断。
  • if some_input is int: 正在测试输入是否是类int...
  • 你最后的选择是错误的;除了大量重复自己之外,它还捕获了非常常见的错误类型,这些错误类型可能由于输入的类型/值以外的原因而引发,从而导致您处理意外的异常。尽量限制你trys的范围,避免意外处理你没想到也不能合理处理的问题导致的异常。

标签: python python-3.x function if-statement optimization


【解决方案1】:

通常您不会期望如此频繁地执行此操作,以至于这是一个主要的性能问题。您的代码中可能还有其他部分是性能限制因素。

通常最好以最简洁且最容易让下一个查看您的代码的人理解的方式对这些内容进行编码。不要沉迷于过早的优化。除非它是非常明显很慢并且会发生很多的事情,否则只需以最干净和最清晰的方式编写代码。如有必要,之后您发现它很慢,您可以对其进行分析以找出它慢的地方并修复它。

你通常会发现这些事情不是问题所在。

【讨论】:

  • 我要求性能,这是一个很好的答案。但其他 cmets,告诉我 EAFP 是这样的方式。但既然你告诉我,这是我的最终结论:我将使用 EAFP,除非它比嵌套函数更清晰
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 2011-03-08
  • 2023-03-26
相关资源
最近更新 更多