我已经问过类似的问题,但是我只是无法理解。
我多次听到乘法确实比除快,所以我认为这是理所当然的。 我正在尝试自己查看它,但是在我的程序部门中,结果却是最快的,我在做什么错了?
有人告诉我,它可能是对编译器/解释器进行了优化,所以我在C ++,Python和Java中进行了尝试,它们显示的结果几乎相同。
import timeit
counter = 0
reverse_counter = 0
for i in range(0,100):
n = timeit.timeit('500.0 * 0.25', number=10000)
m = timeit.timeit('500.0 / 4.0', number=10000)
if n < m:
counter = counter + 1
elif n != m:
reverse_counter = reverse_counter + 1
print(counter)
print(reverse_counter)
37
48
----
42
49
答案 0 :(得分:5)
请记住,python代码是字节编译的。使用常量时,可以预先计算这些常量的算术运算,以便在执行字节码时仅加载常量:
In [234]: import dis
In [235]: dis.dis('500.0 * 0.25')
1 0 LOAD_CONST 2 (125.0)
2 RETURN_VALUE
In [236]: dis.dis('500.0 / 4.0')
1 0 LOAD_CONST 2 (125.0)
2 RETURN_VALUE
字节码是相同的! 这解释了为什么在使用
计时时,您看不到乘法比除法快n = timeit.timeit('500.0 * 0.25', number=10000)
m = timeit.timeit('500.0 / 4.0', number=10000)
让我们编写设置代码,该代码对随机数执行乘法和除法运算:
import timeit
counter = 0
reverse_counter = 0
setup = '''\
import random
x = [random.random() for i in range(10**6)]
y = [random.random() for i in range(10**6)]
'''
multiply = '[xi*yi for xi, yi in zip(x, y)]'
divide = '[xi/yi for xi, yi in zip(x, y)]'
N = 100
for i in range(0, N):
n = timeit.timeit(multiply, setup=setup, number=3)
m = timeit.timeit(divide, setup=setup, number=3)
if n < m:
counter = counter + 1
print('multiply is faster {:.2%} of the time'.format(counter/N))
我的机器上的产量:
multiply is faster 99.00% of the time