我正在使用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)。
我的限制:
答案 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中,您具有潜在的通用对象,强制转换,...
的列表。