나는 이런 종류의 컴퓨팅을위한 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..
O P의 솔루션
%%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
이진 검색 솔루션
%%timeit
for b in blist:
position = bisect.bisect_left(alist, b)
distance = min([b-alist[position-1],alist[position+1]-b])
1 loop, best of 3: 1.57 s per loop
영업 이익의 쉽고 신속
%%timeit
for b in blist:
position=alist.index(b)
distance=min([b-alist[position-1],alist[position+1]-b])
Still running..
모든 이유 조작? C에서 코드의 해당 부분을 다시 작성하고 파이썬과 인터페이스 할 수 있습니까? –
개인용 컴퓨터에서 Python 2.6을 사용하고 있습니다 ** 내장 메모리를 사용하는 ** 메모리 크기가 큰 목록 (10^7), O (n) 연산 ** 수백만 회 ** ** 내장 된 방법 사용 어떤 알고리즘 최적화도없이. 어떤 종류의 공연을 기대하십니까? –
@ VincentSavard가 말한 바. 또는 알고리즘을 벡터화하고 numpy를 사용하여 실제 코드가 매우 똑똑한 C/Fortran 코드에서 실행될 수있는 것처럼 들립니다. 벡터'v' ('type (v) == np.array')와 그 이웃의 각 값 사이의 최소 거리는'np.amin (v [1 :] - v [: - 1])'에 의해 주어진다. . 당신이하려고하는 것은 무엇이든 적응하십시오. –