2016-10-09 6 views
0

numpy의 합계 함수가 특정 수의 값을 추가하는 데 걸리는 시간을 측정했습니다. 아래의 곡선은 numpy의 합계 기능 (녹색)과 표준 파이썬 (루프)이 요소 당 을 더하는 데 걸리는 시간을 나타냅니다.. 예를 들어 10 요소의 배열에서 numpy의 sum 함수를 사용하는 경우 각 요소는 평균 2 -19 초가 필요합니다.Numpy sum은 더 많은 항목으로 더 빨라졌습니다.

random_vector = np.random.random(10**7) 

def for_sum(vector, n): 
    sum = 0 

    start_time = time.perf_counter() 
    for i in range(n): 
     sum += vector[i] 

    return time.perf_counter() - start_time 

def numpy_sum(vector, n): 
    new_vector = vector[:n] 

    start_time = time.perf_counter() 
    np.sum(new_vector) 

    return time.perf_counter() - start_time 

# determines the number of elements we should sum 
spaced_values = np.logspace(1, 7, num=30, dtype=int) 

# Measure time for for loops, per entry 
for_sum_times_per_entry = np.zeros(0) 
for i in spaced_values: 
    for_sum_times_per_entry = np.append(for_sum_times_per_entry, for_sum(random_vector, i)/i) 

# Measure time for numpy sum function, per entry 
numpy_sum_times_per_entry = np.zeros(0) 
for i in spaced_values: 
    numpy_sum_times_per_entry = np.append(numpy_sum_times_per_entry, numpy_sum(random_vector, i)/i) 

# Plot the amount of time required to sum each entries 
plt.loglog(spaced_values, for_sum_times_per_entry, basex=10, basey=2) 
plt.loglog(spaced_values, numpy_sum_times_per_entry, basex=10, basey=2) 
plt.xlabel("Number of values summed") 
plt.ylabel("Single entry computing time (s)") 
plt.show()  

numpy sum and for loop

NumPy와 합 곡선 1 개 요소에 필요한 처리 시간을 합산 증가 될 요소의 총 개수와 같은 더 낮은 얻는 것을 나타낸다 : 여기

코드이다.

이것은 무엇 때문입니까? 내 생각에 numpy의 합계 함수는 처리 시간을 증가시키는 특정 오버 헤드를 갖는다. 이 오버 헤드에는 일정한 시간이 걸리므로 요소를 추가 할 때 중요성이 점차적으로 줄어 듭니다.

+0

생성하고, 오버 헤드가 np.sum '에있다 (X)'. 우선,'x.sum'이 존재하는지 먼저 확인한 다음, 그 것을 연기합니다. – Eric

+0

그래, 그 func 호출 오버 헤드, 그래서 당신이 시간을 np.sum (np.array()]') 및 다양한 오버 헤드를 계산하는 의도와 함께 다양한 datasizes 타이밍에서 뺄 수있을 것으로 보인다. – Divakar

답변

-1

Numpy는 BLAD를 사용합니다. numpy.sum의 경우 로우 레벨 논리를 적용 할 수 있습니다. 전체 배열이 CPU 캐시에 맞으면 플랫 프로필이 표시됩니다. 내 컴퓨터의 L1 캐시는 64킬로바이트이며, 반드시 충분히 numpy.sum의 계산 시간은 64킬로바이트/64 비트/플로트 ~ 8000 플로트 항목보다 더하지 않는 한 평면 남아 :

enter image description here

이를 플롯은 정확한

import math 
import numpy 
import perfplot 


def for_sum(a): 
    sum = 0.0 
    for i in range(len(a)): 
     sum += a[i] 
    return sum 


perfplot.show(
     setup=numpy.random.rand, 
     kernels=[for_sum, numpy.sum, sum, math.fsum], 
     labels=['for-sum', 'numpy.sum', 'sum', 'math.fsum'], 
     n_range=[2**k for k in range(15)], 
     xlabel='len(a)', 
     logx=True, 
     logy=True 
     ) 
관련 문제