我真的很喜歡這種計算的Numpy模塊。
在你的情況,這將是(這是很長的答案,可以工廠化更有效率):
import numpy as np
alist = [1, 4, 30, 1000, 2000]
blist = [4, 30, 1000]
a_array = np.asarray(alist)
b_array = np.asarray(blist)
a_index = np.searchsorted(a_array, b_array) # gives the indexes of the elements of b_array in a_array
a_array_left = a_array[a_index - 1]
a_array_right = a_array[a_index + 1]
distance_left = np.abs(b_array - a_array_left)
distance_right = np.abs(a_array_right - b_array)
min_distance = np.min([distance_left, distance_right], axis=0)
如果blist的第一個元素是第一ALIST的它不會工作,同樣的結局。 我猜:
alist = [b[0] - 1] + alist + [b[-1] + 1]
是一個骯髒的解決方法。
基準
的 「仍在運行」 可能我在我的電腦的錯..
alist = sorted(list(np.random.randint(0, 10000, 10000000)))
blist = sorted(list(alist[1000000:9000001]))
a_array = np.asarray(alist)
b_array = np.asarray(blist)
矢量化解決方案
%%timeit
a_index = np.searchsorted(a_array, b_array)
a_array_left = a_array[a_index - 1]
a_array_right = a_array[a_index + 1]
min_distance = np.min([b_array - a_array_left, a_array_right - b_array], axis=0)
1 loop, best of 3: 591 ms per loop
二進制搜索解決方案
%%timeit
for b in blist:
position = bisect.bisect_left(alist, b)
distance = min([b-alist[position-1],alist[position+1]-b])
Still running..
Ø普的解決方案
%%timeit
for b in blist:
position=alist.index(b)
distance=min([b-alist[position-1],alist[position+1]-b])
Still running..
較小的輸入
alist = sorted(list(np.random.randint(0, 10000, 1000000)))
blist = sorted(list(alist[100000:900001]))
a_array = np.asarray(alist)
b_array = np.asarray(blist)
矢量化解決方案
%%timeit
a_index = np.searchsorted(a_array, b_array)
a_array_left = a_array[a_index - 1]
a_array_right = a_array[a_index + 1]
min_distance = np.min([b_array - a_array_left, a_array_right - b_array], axis=0)
10 loops, best of 3: 53.2 ms per loop
二進制搜索解決方案
OP的soluti在
%%timeit
for b in blist:
position=alist.index(b)
distance=min([b-alist[position-1],alist[position+1]-b])
Still running..
有什麼理由你使用Python進行密集一個CPU操作?你可以用C重寫那部分代碼並將其與Python接口嗎? –
您在個人計算機上使用Python 2.6,使用**內存**列表(10^7),使用內置方法執行O(n)操作**數百萬次**沒有任何算法優化。究竟是什麼樣的表現? –
@VincentSavard說了些什麼。另外,它聽起來像你可以矢量化你的算法並使用numpy,以便實際的代碼運行在非常聰明的C/Fortran代碼中。向量'v'(其中'type(v)== np.array')中的每個值與其相鄰元素之間的最小距離由np.amin(v [1:] - v [: - 1])給出' 。將它適應於你正在嘗試做的任何事情。 –