np.array == num比较非常慢吗?可以使用多处理来加速它吗?

时间:2019-06-04 18:57:33

标签: python performance numpy python-multiprocessing pool

在Python中具有单个数字的大型np.array之间的==比较吗?我使用line_profiler在代码中找到瓶颈。瓶颈只是一个常数为1d的np.array之间的简单比较。它占总运行时间的80%。我做错了什么导致它变慢了吗?有什么办法可以加速它吗?

我尝试使用多重处理,但是,在测试代码(代码段2)中,使用多重处理比顺序运行和直接使用map慢。谁能解释这个现象?

衷心感谢您提出的任何意见或建议。

代码段1:

第#行的每次命中时间%Time行内容

38 12635 305767927.0 24200.1 80.0 res = map(逻辑相等,组合)

def logicalEqual(x):
         return F[:,-1] == x

assembly = [1,2,3,4,5,7,8,9,...,25]

F是一个整数类型(281900,6)np.array

代码段2:

import numpy as np
from multiprocessing import Pool
import time

y=np.random.randint(2, 20, size=10000000)

def logicalEqual(x):
    return y == x

p=Pool()
start = time.time()
res0=p.map(logicalEqual, [1,2,3,4,5,7,8,9,10,11,12,13,14,15])
# p.close()
# p.join()
runtime = time.time()-start
print(f'runtime using multiprocessing.Pool is {runtime}')

res1 = []
start = time.time()
for x in [1,2,3,4,5,7,8,9,10,11,12,13,14,15]:
    res1.append(logicalEqual(x))
runtime = time.time()-start
print(f'sequential runtime is {runtime}')


start = time.time()
res2=list(map(logicalEqual,[1,2,3,4,5,7,8,9,10,11,12,13,14,15]))
runtime = time.time()-start
print(f'runtime is {runtime}')

runtime using multiprocessing.Pool is 0.3612203598022461
sequential runtime is 0.17401981353759766
runtime is  0.19697237014770508

1 个答案:

答案 0 :(得分:0)

数组比较快速,因为它是用C代码而不是Python完成的。

x = np.random.rand(1000000)
y = 4.5
test = 0.55
%timeit x == test
386 µs ± 4.68 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit y == test
33.2 ns ± 0.121 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

因此,将一个Python浮点数与另一个Python浮点数进行比较需要33 * 10 ^ -9 s,而比较1E6 numpy浮点数只需花费386 µs / 33 ns〜= 11700倍,尽管要多比较1000000个值。对于整数(377 µs对34 ns)也是如此。但是,正如Dunes在评论中提到的那样,比较很多值需要很多周期。您无能为力。