在进行一些实验来并行化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
答案 0 :(得分:1)
我想知道在这些循环中是否有任何JIT代码:编译时没有非平凡的 Python 代码,只有C代码上的薄包装器(是的,{ {1}}是C代码)。可能JIT只会增加尝试分析和生成(失败)更高效代码的开销。
如果您想加速,请考虑parallelization using scipy或direct access to NumPy arrays from Cython。