【发布时间】:2018-09-18 03:41:09
【问题描述】:
我正在使用 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。
我的限制:
- 我需要使用 python。虽然我理解普通数学在 C/Java/等中会更快。我无法使用它,因为我在 python 中执行的许多其他操作无法在同一程序中的 C 中完成。
- 我尝试使用 cython 编写此代码,但它导致我需要在其中运行此代码的环境出现一系列问题。所以,再一次 - 不是一个选项。
【问题讨论】:
-
numpy 与并行化无关。你确定你了解你的限制吗?
-
请注意,您的代码将在
for循环的第一次迭代中生成IndexError,因为p[i-1]和i的值是0。 -
@blhsing 它将使用 p 的最后一个索引 - 在第一次迭代中是 0。在第二次迭代中是 p[0] 在最后一行中设置
-
@AbdealiJK 确实。有一个大脑故障时刻。
-
@StephenRauch - 删除它以查看答案,我的意思是这不能修改为向量数学。但也许我对 numpy 功能的理解有限,我看不到一个简单的方法来使用它。
标签: python python-3.x performance math optimization