The Basel problem [Python, pypy] by 바죠

The Basel problem



{\displaystyle \sum _{n=1}^{\infty }{\frac {1}{n^{2}}}={\frac {1}{1^{2}}}+{\frac {1}{2^{2}}}+{\frac {1}{3^{2}}}+\cdots } .




          
파이썬 프로그램의 실행속도를 따져 보고자 한다.
파이썬, 포트란 90 컴퓨터 프로그램을 활용하여, 수치적 방법으로, 위의 공식의 타당성을 체크해보고자 한다. 
특히, 파이썬 언어로 작성된 컴퓨터 프로그램의 계산 속도 향상을 위하여 pypy를 사용해 본다.
파이썬 컴퓨터 프로그램의 최대 약점은 컴퓨팅 속도가 낮다는 것이다. 잘 알려진 사실이다. 파이썬은 컴파일을 하지 않는 언어이다. 파이썬 컴퓨터 언어는 인터프리터언어이기 때문에 실행 속도면에서 상당한 약점을 가지고 있다. 
이러한 약점을 극복하는 것이 pypy이다. 원시코드를 바꾸지 않고 실행 속도 향상을 얻을 수 있다. 

실행속도 향상에 놀라지 마시라!
이런것을 우리는 혁신이라고 한다.


cat basel.py
#!/usr/bin/env python
#Basel problem
import time
def recip_square(i):
    return 1./i**2
def approx_pi(n):
    val = 0.
    for k in range(1,n+1):
        val += recip_square(k)
    return (6 * val)**.5
start=time.time()
tt=approx_pi(1000000000)
print tt
duration=time.time()-start
print duration,duration/60.,duration/60./60.,' sec,min,h'

./basel.py
3.14159264498
1197.87838912 19.9646398187 0.332743996978  sec,min,h

컴퓨터 프로그램을 그대로 사용한다는 점에 주목해야한다.
[guest@gpu python_examples]$ pypy basel.py
3.14159264498
8.51277899742 0.141879649957 0.00236466083262  sec,min,h

일반적으로 계산속도가 빠른 포트란 프로그램을 작성해 보았다.
cat basel.f90
!234567890
       subroutine basel(n,asum)
       implicit none
       integer n
       real*8 asum
       integer i
       asum=0.d0
       do i=1,n
       asum=asum+1.d0/dble(i)**2
       enddo
       asum=(asum*6.d0)**0.5d0
       return
       end
!234567890
       program abc
       implicit none
       integer n
       real*8 asum

       n=1000000000
       call basel(n,asum)
       write(6,*) asum
       end program abc


 gfortran basel.f90
[guest@gpu python_examples]$ time ./a.out
   3.1415926449823899    
real    0m12.776s
user    0m12.770s
sys     0m0.002s


Cython:

numba:




핑백

덧글

댓글 입력 영역

최근 포토로그



MathJax