计算能力的速度(在python中)

Chr*_*two 30 python algorithm performance

我很好奇为什么它的增加速度比在python中获取功能要快得多(尽管从我读过的内容来看,这在很多其他语言中也是如此).例如,它要快得多

x*x
Run Code Online (Sandbox Code Playgroud)

x**2
Run Code Online (Sandbox Code Playgroud)

我认为**算子更通用,也可以处理分数幂.但是,如果这就是为什么它如此慢,为什么它不执行int指数检查然后只是进行乘法?

编辑:这是我试过的一些示例代码...

def pow1(r, n):
  for i in range(r):
    p = i**n

def pow2(r, n):
  for i in range(r):
    p = 1
    for j in range(n):
      p *= i
Run Code Online (Sandbox Code Playgroud)

现在,pow2只是一个简单的例子,显然没有优化!
但即便如此,我发现使用n = 2且r = 1,000,000,则pow1需要~2500ms而pow2需要~1700ms.
我承认,对于大的n值,pow1确实比pow2快得多.但这并不太令人惊讶.

pat*_*ros 24

基本上天真的乘法是O(n),具有非常低的常数因子.取幂是O(log n),具有更高的常数因子(有特殊情况需要测试......分数指数,负指数等).编辑:只是为了清楚,那是O(n),其中n是指数.

当然,对于小n来说,天真的方法会更快,你只是真正实现了一小部分指数数学,所以你的常数因子可以忽略不计.


Nos*_*dna 7

添加支票也是一种费用.你总是想在那里检查吗?编译语言可以检查一个常量指数,看看它是否是一个相对较小的整数,因为没有运行时成本,只是一个编译时成本.解释性语言可能无法进行检查.

这取决于特定的实现,除非语言指定了这种细节.

Python不知道你要为它提供什么样的指数分布.如果它将是99%的非整数值,您是否希望代码每次检查一个整数,使运行时更慢?

  • 编译器无法进行该检查,因为它取决于指数的运行时值。 (2认同)
  • 如果两者之间没有显着的速度差异,我会同意你的观点,但对于我尝试过的所有 x 值来说,x*x 比 x**2 快几倍。当然,为 int 指数添加一个微小的检查不会花费太多,并且在很多情况下会带来一些巨大的性能改进! (2认同)