为什么在Python中x*=y比x=x*y慢?

为什么在Python中x*=y比x=x*y慢?,python,performance,assignment-operator,Python,Performance,Assignment Operator,我试图优化我用Python编写的一些代码,在整个过程中,我一直认为用Python编写x*=y而不是x=x*y更有效(或者在最坏的情况下是等效的)。但使用以下基本测试,情况似乎并非如此 import time t0 = time.time() x = 1.01 for i in range(1000000): x *= 1.000001 print(time.time() - t0) # Outputs 0.1081240177154541 t0 = time.time() x = 1

我试图优化我用Python编写的一些代码,在整个过程中,我一直认为用Python编写
x*=y
而不是
x=x*y
更有效(或者在最坏的情况下是等效的)。但使用以下基本测试,情况似乎并非如此

import time

t0 = time.time()
x = 1.01
for i in range(1000000):
    x *= 1.000001
print(time.time() - t0)
# Outputs 0.1081240177154541

t0 = time.time()
x = 1.01
for i in range(1000000):
    x = x * 1.000001
print(time.time() - t0)
# Outputs 0.07818889617919922

为什么会这样?

我一直在做休闲测试:

def test1(x):
    for i in range(10000000):
        x *= 1.000001

def test2(x):
    for i in range(10000000):
        x = x * 1.000001


%timeit test1(1.01)
# 511 ms ± 25.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit test2(1.01)
# 591 ms ± 87.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
差别如此之小,以至于你可以说性能是一样的


正如我的结果所显示的(与您的结论相反),不同机器之间或不同运行之间的结果可能不同

将循环量乘以10,然后运行测试几次,您将看到时间几乎相同。当我运行此测试时,时间差不到10000分之一。我建议使用一种更可靠的方法,比如
timeit
。另外,use可以在jupyter笔记本中使用timeit,并指定每次运行的次数和循环次数。例如,10次运行,每个循环10次:
%%timeit-r 10-n 10
谢谢。你到底是如何使用timeit来产生这个输出的?我使用Python3.7的jupyter笔记本,从一次运行到另一次运行,结果与空闲时的结果不一样。我不会说平均加速15%特别小,特别是对于这种低级的东西。我猜是
float.\uuurmul\uuuuu
在后台做了一些额外的工作,尽管我无法从源代码中确定它。例如,
x*=1j
x
从浮点变为复数(并更改
id(x)
)。所以大概
float.\uuuurmul\uuuuuu
会对
float.\uuuuuu mul\uuuu
中多余的两个参数进行一些检查。