为什么python的内置乘法如此之快

时间:2014-02-22 16:57:55

标签: python algorithm

所以前几天我在python中尝试了一些东西,我试图在python中编写自定义乘法函数

def multi(x, y):
    z = 0
    while y > 0:
        z = z + x
        y = y - 1
    return z

然而,当我用非常大的数字运行时,如(1 <90)和(1 <45),即(2 ^ 90)*(2 ^ 45)。计算花了很长时间。 所以我试着研究不同类型的乘法,比如在那里实现的俄罗斯农民乘法技术,它非常快但不像多(x,y)那样可读

def russian_peasant(x, y):
    z = 0
    while y > 0:
        if y % 2 == 1: z = z + x
        x = x << 1
        y = y >> 1
    return z 

我想要你回答的是如何编程语言如python乘以数字?

4 个答案:

答案 0 :(得分:11)

您的multi版本在O(N)中运行,而russian_peasant版本在O(logN)中运行,这远远好于O(N)。

要了解russian_peasant版本的速度,请查看

from math import log
print round(log(100000000, 2))   # 27.0

因此,循环必须执行27次,但是当multi为100000000时,y版本的while循环必须执行100000000次。

要回答您的其他问题,

  

我想要你回答的是如何编程语言如python   乘以数字?

Python使用O(N^2) grade school multiplication algorithm for small numbers,但适用于big numbers it uses Karatsuba algorithm

基本上乘法是用C代码处理的,可以编译成机器代码并执行得更快。

答案 1 :(得分:4)

像Python这样的编程语言使用计算机CPU提供的乘法指令。

此外,您必须记住,Python是一种非常高级的编程语言,它运行在一台虚拟机上,该虚拟机本身就在您的计算机上运行。因此,它固有地比本机代码慢几个数量级。将算法转换为汇编(甚至转换为C)将导致大量加速 - 尽管它仍然比CPU的乘法运算慢。

从好的方面来说,与天真汇编/ C不同,当你的数字大于2 ** 32时,Python会自动将整数提升为bignums而不是溢出。

答案 2 :(得分:3)

您的问题的基本答案是,使用*的乘法是通过C代码处理的。本质上,如果你在纯python中写一些东西,它会比C实现慢,那么让我给你一个例子。

operator.mul函数在C中实现,但lambda在Python中实现,我们将尝试使用functools.reduce查找数组中所有数字的乘积我们将使用两个案例,一个使用operator.mul,另一个使用lambda,它们都做同样的事情(表面上):

from timeit import timeit
setup = """
from functools import reduce
from operator import mul
"""

print(timeit('reduce(mul, range(1, 10))', setup=setup))
print(timeit('reduce(lambda x, y: x * y, range(1, 10))', setup=setup))

输出:

1.48362842561
2.67425475375
正如您所见,

operator.mul花费的时间更少。

答案 3 :(得分:0)

通常,涉及许多计算的函数式编程最好使用 memoization 花费更少的时间 - 基本思想是如果你提供一个真正的函数(总是为给定的结果评估相同的结果)参数)同样的事情两次或更多,你浪费时间,通过识别公共调用并将他们评估的任何内容存储到哈希表或其他快速可访问的对象中,可以轻松地节省时间。有关基本理论,请参阅https://en.wikipedia.org/wiki/Memoization。它在Common Lisp中得到了很好的实现。