【问题标题】:Why v*v is faster than v**2 in python为什么 v*v 在 python 中比 v**2 快
【发布时间】:2019-01-08 13:18:29
【问题描述】:

我试图测量v*vv**2 之间的性能。结果就像下面这样

# test was generated with randint(1, 999)

# 0.10778516498976387
print(timeit.timeit("sum([item*item for item in test])", number=10000, setup="from __main__ import test"))

# 0.35526178102009
print(timeit.timeit("sum([item**2 for item in test])", number=10000, setup="from __main__ import test"))

我开始这个实验的原因是我不想在列表理解中做同样的操作。

由于运算符出现一次,(例如(item-3) * (item*3)(item-3)**2)我认为(item-3)**2 会比(item-3)*(item-3) 快。但情况完全相反。

谁能解释一下原因?

[+]我用的是python3.6.0

【问题讨论】:

  • 速度与x**3x**2.5相比如何?
  • 因为乘法比求幂快。如果 Python(或底层 C 数学代码,或 CPU)使用特殊情况的正方形和立方体,使用乘法来完成它们会很好,但显然它没有。
  • @StephenRauch 即使 x**4 与上面的结果相同

标签: python python-3.x operators


【解决方案1】:

因为* 是一种深深植根于处理器的算术运算,而**pow 函数的包装器。

使用k ** 2k * k 有更多开销,因为python 将在内部调用pow 函数。

【讨论】:

  • ** 并不是pow() 函数的真正包装器。内置的pow() 函数calls PyNumber_Power()** is translated to bytecode BINARY_POWER 被评估为对PyNumber_Power() 的调用。所以是的,PyNumber_Power() 比简单的乘法要慢,但是调用不会去 ** => pow() => PyNumberPower()
  • @StevenRumbalski 感谢您提供的信息。你的意思是说** 被翻译成字节码,即没有函数调用,或者它被翻译成对PyNumber_Power() 的调用而不是pow()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多