加快Python中的for循环

时间:2019-05-15 11:22:32

标签: python loops parallel-processing

我知道有很多关于加快循环的问题,尤其是使用多处理工具时。我已经检查了很多,但仍然找不到能帮助我解决问题的东西。

我有一段我确实需要加快速度的代码,因为我必须运行数百万次。

瓶颈之一似乎是for循环,我在main for循环中有8次迭代。在循环遍历字符串列表的for循环中,我有一个相当复杂的函数,该函数调用已经使用numba加快了速度的其他几个函数。问题在于我在每次迭代中所做的计算都不依赖于先前的计算,而是可以独立进行。由于我执行了8次,所以我猜我的代码的这一部分可能比现在快8倍。

我已经使用%timeit对这个函数进行了计时,并且通常需要不到80ms的时间来运行(仍然有改善的空间,但这是另外一回事了),因此整个for循环需要约0.65秒的时间来运行。

我尝试使用多处理模块,但很奇怪,似乎使问题变得更糟,因为运行此循环需要5秒钟以上。

我的代码的简化版本:

import numpy as np

final_results = []

for k in range(5e6):

    # do some calculations

    results = []
    for char in char_list:
        results.append( value_calculation(char, args1, arg2, arg3, arg4) )

    mean_result = np.mean( results ) 

final_results.append( mean_results)

主循环的每次迭代大约需要1秒钟,我不明白,因为小循环之前和之后的代码都需要不到1毫秒的时间才能运行。

正如我提到的,我已经尝试使用像这样的多处理模块:

from multiprocessing import Pool

def arg_wrapper(args):
    return value_calculation (*args)

p = Pool (processes = 4)
%timeit p.map( arg_wrapper, ( (char, args1, arg2, arg3, arg4) for char in char_list) )

这给了我5.5秒的时间!!理想情况下,整个for循环应少于0.1秒。

这是我第一次尝试并行编码,因此,除了我在许多其他问题中看到的多处理模块之外,我不知道还有什么可以用来并行运行此for循环并加速我的代码。

我还应该提到,我通常使用Linux机器(尽管这也适用于Windows)和Spyder 3.2.8上的Python 3.6。

编辑:看来我的台式计算机有4个核心。

0 个答案:

没有答案
相关问题