如何加快计算繁重的python程序的运行时间

时间:2017-09-12 05:54:41

标签: python amazon-web-services amazon-ec2

我想知道如何加速运行涉及大型数据集的大量计算的程序。所以,我有5个python程序,每个程序都在大型数据集上执行一些复杂的计算。例如,程序之一的一部分如下:

df = get_data_from_redshift()
cols = [{'Col': 'Col1', 'func': pd.Series.nunique}, 
{'col': 'Col2', 'func': pd.Series.nunique},
{'col': 'Col3', 'func': lambda x: x.value_counts().to_dict()},
{'col': 'Col4', 'func': pd.Series.nunique},
{'col': 'Col5', 'func': pd.Series.nunique}]

d = df.groupby('Column_Name').apply(lambda x: tuple(c['func'](x[c['col']]) for c in cols)).to_dict()

其中get_data_from_redshift()连接到红移群集,从数据库获取数据,将其写入数据帧(dataframe约为600,000 rows x 6 columns)。

其他程序也使用此数据框df并执行大量计算,每个程序将其结果写入pickle文件。

最终程序加载由5个程序创建的pickle文件,进行一些计算以获得大约300,000个值,然后根据集群中的另一个数据库进行检查,得到final file output

单独运行每个程序需要几个小时(有时是一夜之间)。但是,我需要在一小时内完成所有事情并给我final output file

我尝试将其中一个程序放在EC2实例上以查看性能是否有所改善,但它已经超过3个小时且仍在运行。我尝试了m4.xlargec4.xlarger4.xlarge个实例,但没有一个是有用的。

有没有办法加快总运行时间?

也许我可以在不同的EC2实例上运行5个程序中的每个程序,但随后每个程序都会给出一个输出文件,最终程序必须使用该文件。因此,如果我在多个实例上运行,每个程序的输出文件将保存在不同的服务器上,对吧?那么最终的程序将如何使用它们呢?我们可以将每个文件的输出文件保存到最终程序可以访问的公共位置吗?

我听说GPU比CPU快14倍,但我从未使用过它们。在这种情况下,使用GPU实例会有什么帮助吗?

对不起,我是新来的,但真的不知道如何去做。

1 个答案:

答案 0 :(得分:1)

你需要找出导致它变慢的原因,如果你现在想不出其他任何东西,你可以使用profiler开始。找出确切的问题是让它更好地运作的最简单方法。

以下是一般方法。

首先,架构/算法的优化可以大大优于任何其他优化(如编程语言,工具,甚至记忆等技术)。因此,首先要彻底了解您的算法是否可以改进。它包括寻找可以并发运行的部件,这些部件可以并行执行。例如,使用map-reduce而不是线性数据处理可以将执行时间降低到分数!但是它需要能够(并相互排他地)进行处理以进行并行处理。

接下来应该找到不必要的循环或计算。使用memoization等技术也可以大大提高性能。

如果有任何通信或I / O任务(例如,与你提到的红移群集的通信)是时间的话(这似乎与你无关,因为你已经表现出对计算的担忧慢)

然后有一些小的优化,比如使用map,filter或使用生成器表达式而不是列表等函数可以稍微优化(非常)。