在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
答案 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在评论中提到的那样,比较很多值需要很多周期。您无能为力。