用numba prange封装for循环的Python并行化。为什么不工作

时间:2018-03-12 16:05:14

标签: python numba

在进行一些实验来并行化3个封装循环与numba时,我意识到一种天真的方法实际上并没有提高性能。 以下代码生成以下时间(以秒为单位):

0.154625177383  # no numba
0.420143127441  # numba first time (lazy initialisation)
0.196285963058  # numba second time
0.200047016144  # nubma third time
0.199403047562  # nubma fourth time

知道我做错了什么吗?

import numpy as np
from numba import jit, prange
import time


def run_1():
    dims = [100,100,100]
    a = np.zeros(dims)
    for x in range(100):
        for y in range(100):
            for z in range(100):
                a[x,y,z] = 1
    return a

@jit
def run_2():
    dims = [100,100,100]
    a = np.zeros(dims)
    for x in prange(100):
        for y in prange(100):
            for z in prange(100):
                a[x,y,z] = 1
    return a


if __name__ == '__main__':
    t = time.time()
    run_1()
    elapsed1 = time.time() - t
    print elapsed1

    t = time.time()
    run_2()
    elapsed2 = time.time() - t
    print elapsed2

    t = time.time()
    run_2()
    elapsed3 = time.time() - t
    print elapsed3

    t = time.time()
    run_2()
    elapsed3 = time.time() - t
    print elapsed3

    t = time.time()
    run_2()
    elapsed3 = time.time() - t
    print elapsed3

1 个答案:

答案 0 :(得分:1)

我想知道在这些循环中是否有任何JIT代码:编译时没有非平凡的 Python 代码,只有C代码上的薄包装器(是的,{ {1}}是C代码)。可能JIT只会增加尝试分析和生成(失败)更高效代码的开销。

如果您想加速,请考虑parallelization using scipydirect access to NumPy arrays from Cython