【发布时间】:2019-06-04 18:57:33
【问题描述】:
在 python 中,大型 np.array 与单个数字之间的 == 比较是否非常低?我使用 line_profiler 来定位我的代码中的瓶颈。瓶颈只是一维 np.array 与常数之间的简单比较。它占总运行时间的 80%。我做错了什么导致它这么慢吗?有什么方法可以加速吗?
我尝试使用多处理,但是,在测试代码(sn-p 2)中,使用多处理比按顺序运行并直接使用映射要慢。谁能解释这种现象?
衷心感谢任何 cmets 或建议。
片段 1:
Line # Hits Time Per Hit %Time Line Contents
38 12635 305767927.0 24200.1 80.0 res = map(logicalEqual,assembly)
def logicalEqual(x):
return F[:,-1] == x
assembly = [1,2,3,4,5,7,8,9,...,25]
F 是一个 int 类型的 (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
【问题讨论】:
-
map不会真正运行函数,除非你在 Python 3 上迭代生成的迭代器。不运行函数会很快,你可能猜到了。 -
@user2357112 是的,你是对的。我忽略了这一点。现在我纠正了我的问题中的误导部分。非常感谢。
-
F有多大?x是什么,F的数据类型是什么? -
F 是 int 类型 np.array sied of (281900, 6)
-
我认为你没有意识到你要求程序做多少工作。您实际上是在要求程序将约 10 个数字与约 1000 万个其他数字进行比较。这大约是十亿的 1/10。 CPU 通常以另一个 GHz 为单位(或每秒数十亿次操作)。因此,预计您的程序运行时间约为 1/10 秒。
标签: python performance numpy python-multiprocessing pool