我一直在尝试优化我过去两天编写的 python 脚本。使用几个分析工具(cProfile、line_profiler 等),我将问题缩小到以下函数。
df
是一个具有 3 列和 +1,000,000 行的 numpy 数组(数据类型为浮点数)。使用 line_profiler,我发现该函数在需要访问 numpy 数组时花费大部分时间。
full_length += head + df[rnd_truck, 2]
和
full_weight += df[rnd_truck,1]
花费大部分时间,其次是
full_length = df[rnd_truck,2]
full_weight = df[rnd_truck,1]
线。
据我所知,瓶颈是由函数试图从 numpy 数组中获取一个数字的访问时间引起的。
当我运行该函数时,MonteCarlo(df, 15., 1000.)
在具有 8GB RAM 的 i7 3.40GhZ 64 位 Windows 机器中调用该函数 1,000,000 次需要 37 秒。在我的应用程序中,我需要运行 1,000,000,000 次才能确保收敛,这会使执行时间超过一个小时。我尝试使用operator.add
求和线的方法,但它根本没有帮助我。看来我必须想出一种更快的方法来访问这个 numpy 数组。
欢迎任何想法!
def MonteCarlo(df,head,span):
# Pick initial truck
rnd_truck = np.random.randint(0,len(df))
full_length = df[rnd_truck,2]
full_weight = df[rnd_truck,1]
# Loop using other random truck until the bridge is full
while 1:
rnd_truck = np.random.randint(0,len(df))
full_length += head + df[rnd_truck, 2]
if full_length > span:
break
else:
full_weight += df[rnd_truck,1]
# Return average weight per feet on the bridge
return(full_weight/span)
下面是df
我正在使用的 numpy 数组的一部分:
In [31] df
Out[31]:
array([[ 12. , 220.4, 108.4],
[ 11. , 220.4, 106.2],
[ 11. , 220.3, 113.6],
...,
[ 4. , 13.9, 36.8],
[ 3. , 13.7, 33.9],
[ 3. , 13.7, 10.7]])