나는 숫자의 소인수를 찾는 프로그램을 작성했습니다. 큰 숫자 (600851475143)를 입력하면 MemoryError
가 나타납니다. 다음은 코드입니다.
def fact(a): factors = [] for i in range(1,a+1): if a%i == 0: factors.append(i) return factors num = raw_input(">> ") #600851475143 a = b = [] a = fact(long(num)) for i in range(0,len(a)): b = fact(a[i]) if len(b) <= 2: print a[i]
탐색을 통해 Python이 컴퓨터 메모리 (RAM)를 사용한다는 것을 알게되었습니다. 구성을 변경하지 않고 Unbuntu에서 Python을 사용하고 있습니다. 64 비트 컴퓨터에서 작동하도록 anythig를 변경해야합니까? 또는이 오류를 해결하기 위해 추가 기능을 사용해야합니까?
댓글
답변
프로그램에서 사용하는 메모리를 측정하는 다양한 방법이 있으며 사용자 별 제한 등입니다.
그러나 모든 것을 저장하지 않고 시퀀스를 생성 할 수 있으므로 처음에 해당 메모리를 할당 할 필요가 없습니다.
def fact(a): "just return a generator for the sequence you want" return (i for i in xrange(1,a+1) if a % i == 0)
반복적으로 색인을 생성 할 필요없이 시퀀스를 직접 반복 할 수도 있습니다.
for b in fact(long(num)): print b
댓글
- 질문의 목록은 2.2TB입니다. 리소스 제한을 높이면 도움이 될 것 같지 않습니다 .-D
- 음, OP는 2035 년까지 기다릴 수 있습니다. 8TB SIMMS를 사용할 수 있습니다.
range(1, a+1)
는 600851475143 요소가있는 목록을 생성하려고합니다. 각 요소가 정수이고 각 정수가 4 바이트를 차지하므로 이것은 아마도 원하는 것이 아닙니다. (또한이 질문은 ' 프로그래머에게 적합하지 않습니다. 실제로 코드 검토가 필요하고 특히 python의 작동 방식을 이해해야하기 때문입니다.)xrange
-필요에 따라 요소를for
루프로 반환하는 생성기입니다. 이것이 유일한 문제는 아닐 수도 있습니다. .)