乘法真的快于除法吗?

时间:2019-07-14 23:44:59

标签: python optimization

我已经问过类似的问题,但是我只是无法理解。

我多次听到乘法确实比除快,所以我认为这是理所当然的。 我正在尝试自己查看它,但是在我的程序部门中,结果却是最快的,我在做什么错了?

有人告诉我,它可能是对编译器/解释器进行了优化,所以我在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

1 个答案:

答案 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