首页 > 解决方案 > 在python中添加/相乘两个浮点标量数的最快方法

问题描述

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

进行大约 400,000,000 次加法/乘法运算大约需要 35 秒。

我试图弄清楚我可以做这个数学的最快方法是什么。

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

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()被调用了大约 200k 次。loop_count大约是 30。我有 ~20 次乘法和 ~45 次加法和 ~10 次使用 min/ max

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

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

我的限制:

标签: pythonpython-3.xperformancemathoptimization

解决方案


我认为你应该考虑使用 numpy. 你没有提到任何约束。

一个简单的点操作的例子(xy)

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 中,你有一个潜在的通用对象列表,铸造,......


推荐阅读