我具有以下功能来找到两个矩形的交点。它有点慢,我不知道这是由于OR
条件还是>,<
运算符引起的。我想知道是否有一种方法可以提高is_intersect()函数的性能。也许和NumPy在一起?还是Cython?
import numpy as np
def is_intersect(rect1, rect2):
xmin1, xmax1, ymin1, ymax1 = rect1
xmin2, xmax2, ymin2, ymax2 = rect2
if xmin1 > xmax2 or xmax1 < xmin2:
return False
if ymin1 > ymax2 or ymax1 < ymax2:
return False
return True
N_ELEMS = 100000000
rects1 = np.random.rand(N_ELEMS,4)
rects2 = np.random.rand(N_ELEMS,4)
temp_dct = dict()
for i in range(N_ELEMS):
rect1 = rects1[i,:]
rect2 = rects2[i,:]
if is_intersect(rect1, rect2):
temp_dct[i] = True
我不能从缓存结果中获利,因为这些点将是增量的,也就是说,一个矩形将在空间中移动(永远不会在同一位置)。在此示例中,我使用了NumPy的random()
函数,但实际使用情况并非如此。我将调用is_intersect()函数100000000次或更多次。
问题来源:stackoverflow
您可以通过使用向量化比较和np.any
避免for循环来提高性能:
result = (1 - np.any([rects1[:,0] > rects2[:,1],
rects1[:,1] < rects2[:,0],
rects1[:,2] > rects2[:,3],
rects1[:,3] < rects2[:,2]],
axis=0)).astype(bool)
您没有字典,但是可以按索引访问result
。
1亿个元素的性能:
import numpy as np
import timeit
N_ELEMS = 100_000_000
rects1 = np.random.rand(N_ELEMS,4)
rects2 = np.random.rand(N_ELEMS,4)
start_time = timeit.default_timer()
result = (1 - np.any([rects1[:,0] > rects2[:,1],
rects1[:,1] < rects2[:,0],
rects1[:,2] > rects2[:,3],
rects1[:,3] < rects2[:,2]],
axis=0)).astype(bool)
print(timeit.default_timer() - start_time)
2.9162093999999996
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。