使用 scipy.integrate quad 集成超过 300000k 行非常慢
Integrate over 300000k rows with scipy.integrate quad is very slow
我在具有 366036 行的数据框“df_append”上使用以下定义。
df 有列 Fn 和 a.
def f(r):
return (((3*Fn[i])/(2*math.pi*a[i]**2))*(1-((r**2)/(a[i]**2)))**(1/2))
res = []
for i in range(len(df_append)):
res += [(1/(-a[i]-a[i]))*(quad(f, a[i], -a[i])[0])]
而且速度非常慢,大约需要 10 分钟。关于如何加快它的任何想法?
看看你的功能
它会绘制一个半椭圆,高3Fn[i]/2*pi*a[i]**2
,宽2*a[i]
。
因此您可以将整个集成替换为
res = []
for i in range(len(df_append)):
res += [(3*Fn[i])/(8*a[i]**2)]
这应该会显着加快速度,运行 不到 1 秒。
如果您的 Fn
和 a
可以广播算术运算,例如numpy 数组,你可以简单地写
res = (3*Fn[i])/(8*a[i]**2);
并且 运行 不到 0.1 秒。
我在具有 366036 行的数据框“df_append”上使用以下定义。 df 有列 Fn 和 a.
def f(r):
return (((3*Fn[i])/(2*math.pi*a[i]**2))*(1-((r**2)/(a[i]**2)))**(1/2))
res = []
for i in range(len(df_append)):
res += [(1/(-a[i]-a[i]))*(quad(f, a[i], -a[i])[0])]
而且速度非常慢,大约需要 10 分钟。关于如何加快它的任何想法?
看看你的功能
它会绘制一个半椭圆,高3Fn[i]/2*pi*a[i]**2
,宽2*a[i]
。
因此您可以将整个集成替换为
res = []
for i in range(len(df_append)):
res += [(3*Fn[i])/(8*a[i]**2)]
这应该会显着加快速度,运行 不到 1 秒。
如果您的 Fn
和 a
可以广播算术运算,例如numpy 数组,你可以简单地写
res = (3*Fn[i])/(8*a[i]**2);
并且 运行 不到 0.1 秒。