在python中将两个浮点标量数字相加/相乘的最快方法

时间:2018-09-18 03:41:10

标签: python python-3.x performance math optimization

我正在使用python,显然我程序中最慢的部分是对float变量进行简单加法。

大约需要35秒来完成约400,000,000次加法/乘法。

我正在尝试找出最快的数学方法。

这是我的代码结构的样子。 示例(虚拟)代码:

def func(x, y, z):
    loop_count = 30
    a = [0,1,2,3,4,5,6,7,8,9,10,11,12,...35 elements]
    b = [0,11,22,33,44,55,66,77,88,99,1010,1111,1212,...35 elements]
    p = [0,0,0,0,0,0,0,0,0,0,0,0,0,...35 elements]
    for i in range(loop_count - 1):
        c = p[i-1]
        d = a[i] + c * a[i+1]
        e = min(2, a[i]) + c * b[i]
        f = e * x
        g = y + d * c
        .... and so on
        p[i] = d + e + f + s + g5 + f4 + h7 * t5 + y8
    return sum(p)

func()被调用约20万次。 loop_count大约是30。我有〜20个乘法和〜45个加法,以及min / max的〜10次使用

我想知道是否有一种方法可以将所有这些声明为ctypes.c_float并使用stdlib或类似方法在C语言中进行加法运算?

请注意,在循环结束时计算的p[i]在下一次循环迭代中用作c。对于迭代0,它仅使用p [-1](在这种情况下为0)。

我的限制:

  • 我需要使用python。虽然我了解普通数学在C / Java / etc中会更快。由于我在python中做过很多其他事情,而在同一程序中用C无法完成,因此我无法使用它。
  • 我尝试使用cython编写此代码,但它导致了我需要在其中运行该环境的一系列问题。因此,再次-不能选择。

1 个答案:

答案 0 :(得分:0)

我认为您应该考虑使用numpy。您没有提到任何约束条件。

简单点运算(x.y)的示例情况

import datetime
import numpy as np

x = range(0,10000000,1)
y = range(0,20000000,2)
for i in range(0, len(x)):
    x[i] = x[i] * 0.00001
    y[i] = y[i] * 0.00001

now =  datetime.datetime.now()
z = 0
for i in range(0, len(x)):
    z = z+x[i]*y[i]
print "handmade dot=", datetime.datetime.now()-now
print z

x = np.arange(0.0, 10000000.0*0.00001, 0.00001)
y = np.arange(0.0, 10000000.0*0.00002, 0.00002)

now =  datetime.datetime.now()
z = np.dot(x,y)
print 'numpy dot =',datetime.datetime.now()-now
print z

输出

handmade dot= 0:00:02.559000
66666656666.7
numpy dot = 0:00:00.019000
66666656666.7

numpy的速度提高了100倍以上。

原因是numpy封装了一个C库,该库对编译后的代码执行点操作。在完整的python中,您具有潜在的通用对象,强制转换,...​​

的列表。