Tim Peters는 왜 이것이 느린 지 대답 했지만 개선 방법을 살펴 보겠습니다 .
귀하의 예를 고수하십시오 sum(range(...))
(여기에서 메모리에 맞추기 위해 귀하의 예보다 요소 10이 작습니다)
import numpy
import array
L = list(range(10**7))
A = array.array('l', L)
N = numpy.array(L)
%timeit sum(L)
10 loops, best of 3: 101 ms per loop
%timeit sum(A)
1 loop, best of 3: 237 ms per loop
%timeit sum(N)
1 loop, best of 3: 743 ms per loop
이 방법은 또한 numpy가 추가 오버 헤드가있는 박스 / 박스를 해제해야합니다. 빨리 만들려면 numpy c 코드 내에 있어야합니다.
%timeit N.sum()
100 loops, best of 3: 6.27 ms per loop
따라서 목록 솔루션에서 numpy 버전까지는 런타임에서 요소 16입니다.
이러한 데이터 구조를 만드는 데 걸리는 시간도 확인하십시오
%timeit list(range(10**7))
1 loop, best of 3: 283 ms per loop
%timeit array.array('l', range(10**7))
1 loop, best of 3: 884 ms per loop
%timeit numpy.array(range(10**7))
1 loop, best of 3: 1.49 s per loop
%timeit numpy.arange(10**7)
10 loops, best of 3: 21.7 ms per loop
우승자 : Numpy
또한 데이터 구조를 만드는 데는 합산하는 데 많은 시간이 걸립니다. 메모리 할당 속도가 느립니다.
그것들의 메모리 사용량 :
sys.getsizeof(L)
90000112
sys.getsizeof(A)
81940352
sys.getsizeof(N)
80000096
따라서 이들은 다양한 오버 헤드로 숫자 당 8 바이트를 사용합니다. 우리가 사용하는 범위에는 32 비트 정수가 충분하므로 일부 메모리를 안전하게 보호 할 수 있습니다.
N=numpy.arange(10**7, dtype=numpy.int32)
sys.getsizeof(N)
40000096
%timeit N.sum()
100 loops, best of 3: 8.35 ms per loop
그러나 64 비트 정수를 추가하면 내 컴퓨터의 32 비트 정수보다 빠르므로 메모리 / 대역폭에 의해 제한되는 경우에만 가치가 있습니다.