我有三个数组,一个arr
的id,一个range
数组和一个query
数组。arr
和query
非常大。query
中的一些值存在于arr
中,而另一些则不存在。类似地,query
中的一些值在range
范围内,而另一些则不在。
x1m10 n1x中存在的x1m9 n1x中的值的数据来自源A,x1m11 n1x中不存在的值的数据来自源B。然后我将它们合并在一起,保持与query
相同的原始顺序。例如,在下面的代码中,值15的数据应该位于result
数组的索引1处,因为15位于query
数组的索引1处。range
也是如此。
我有一个简单的代码:
arr = np.array([1,7,3,9,5,10,2,8,4,6])
range = np.array([2,6])
query = np.array([3,15,6,8,13,5,19])
contains = []; contains_idx = []
not_contains = []; not_contains_idx = []
in_range = []; in_range_idx = []
not_in_range = []; not_in_range_idx = []
contains_mask = np.full(len(query), False)
range_mask = np.full(len(query), False)
for idx,x in enumerate(query):
if x in arr:
contains.append(x)
contains_idx.append(idx)
contains_mask[idx] = True
else:
not_contains.append(x)
not_contains_idx.append(idx)
if x >= range[0] and x <= range[1]:
in_range.append(x)
in_range_idx.append(idx)
range_mask[idx] = True
else:
not_in_range.append(x)
not_in_range_idx.append(idx)
result = np.zeros((len(query), 5)) # 5 dimensions, n x 5 array.
# Now I get the data for the values in contains and not_contains arrays.
# For simplicity, I am generating random data here.
data_for_contains = np.random.random((len(contains), 5))
data_for_not_contains = np.random.random((len(not_contains), 5))
# Put the acquired data in the result array, keeping the same order as query.
result[contains_idx] = data_for_contains
result[not_contains_idx] = data_for_not_contains
# The same operations are carried out to generate result for the in_range and not_in_range arrays.
# Some other operations are carried out on the mask arrays, omitted here.
由于arr
非常大,而query
也非常大(尽管比arr
小),所以这段代码很慢。有没有办法优化它的速度和性能?
另外,这可以使用GPU加速吗?
2条答案
按热度按时间cl25kdpy1#
您可以使用Python Set加速**
x in s
的进程。Python Set被实现为hash map**,因此the average time complexity of
x in s
operation isO(1)
,这比NumPy数组的in
操作(O(N)
)快得多。我可以给你看一些简单的实验:
这是代码的简化版本:
Python Set优化版本:
从23.9ms到691us,性能提升了34.5倍。
44u64gxh2#
不要循环。