import sys
import time
def Factorial(N):
checkSize = 5000
endN = N / checkSize
facResult = 1
for fi in range(1, endN + 1):
facResult = facResult * reduce(lambda x, y : x * y, range((fi-1)*checkSize+1,fi * checkSize+1))
if ( (endN * checkSize + 1) != (N+1) ):
facResult = facResult * reduce(lambda x, y : x * y, range(endN * checkSize + 1, N+1))
return facResult
number = 100000
startTime = time.time()
factorialN = Factorial(number)
print "runtime is %s"%(time.time() - startTime)
#print "Factorial %d is %d"%(number, factorialN)
인터넷을 검색 중 100000! 계산에 관한 글을 보고 실습해 본 코드.
2008년 구매한 노트북에서도 3.2초면 계산이 끝난다. ( * 결과 출력 할 때는 "젠틀맨" 뮤비 한 편 보고 나면 된다. )
math.factorial() 함수를 사용하는 것보다, 분할해서 계산하는게 3배 이상 빠르다.
* 참고 : 100000! 관련 KLDP 링크
http://kldp.org/node/129900
http://kldp.org/node/129379
http://kldp.org/node/129116
http://kldp.org/node/129044
http://kldp.org/node/107470
100000! 결과 : 100000.txt
심심해서 추가로 돌려본 1000000! ( 백만 팩토리얼 )
계산은 5분 만에 끝났으나, 출력이 한 시간도 넘게 걸린 듯...
1000000! 결과 : 1000000!.zip