【问题标题】:How to speed up the run time of computation heavy python programs如何加快计算量大的python程序的运行时间
【发布时间】:2017-09-12 05:54:41
【问题描述】:

我想知道如何加快涉及在大型数据集上进行大量计算的程序的运行速度。所以,我有 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() 连接到 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 实例会有帮助吗?

对不起,我是新来的,但真的不知道该怎么做。

【问题讨论】:

  • 休斯顿,我们有问题。 “我听说 GPU 比 CPU 快 14 倍……在这种情况下使用 GPU 实例会有帮助吗?我听说了水产生黄金。这会有帮助吗? 恕我直言,这很严重。大型远程托管数据集上的高度复杂的过程永远不会有资格在 SIMD / SMX GPU 硬件上获得合理的加速,以 将约 12 小时 [SEQ] 处理时间缩短为“我需要整个事情在一个小时”。实事求是,得到定量支持……连续复杂的处理存在问题(参考阿姆达尔定律)
  • 如果您的主要过程的 [PAR] 部分没有超过 99%,则 [SEQ] 部分剩余不到 1%,并尽可能避免分布式处理设置/撕裂-降低开销,即使有无限数量的并行处理器,您也永远无法获得您所要求的 12 倍加速。只需收益递减规律解释,为什么这永远不会,确实永远不会发生。可能**使用交互式可视化建模工具进行原型设计/证明这些见解可用于扩展 [SEQ]+[PAR] 时间表:stackoverflow.com/a/46124635

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


【解决方案1】:

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

这个,下面是一个通用的方法。

首先,架构/算法的优化可以大大优于任何其他优化(例如编程语言、工具甚至记忆化等技术提供的优化)。因此,首先要彻底查看您的算法是否可以改进。它包括寻找可以同时运行、可以并行执行的部分。例如,使用 map-reduce 代替线性数据处理可以将执行时间降低到几分之一!但它需要能够将处理划分(互斥)以进行并行处理。

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

如果有任何需要花费时间的通信或 I/O 任务(例如,与您提到的 redshift 集群的通信)(这似乎与您无关,因为您已经表现出对计算的担忧)慢)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    相关资源
    最近更新 更多