[테스트 환경]
OS : CentOS 7
DB : MariaDB 10.1.12
Programming : Python 3.5
1. 함수 작성
- 업종 마스터 테이블에서 업종 코드를 불러와서 해당 업종 코드에 속하는 종목의 종가 합계 구하기
import pp from datetime import datetime import sys, socket, pymysql IpAddr = socket.gethostbyname(socket.gethostname()) conn = pymysql.connect(host=IpAddr, port=3306, user='root', passwd='root', db='STOCK',charset='utf8',autocommit=True) cur = conn.cursor() def sum_indtp(n, date): result = 0 sql = 'SELECT B.CLOSE FROM J_MASTER A, J_DAILY B WHERE A.INDTP_CODE = ' sql += n sql += ' AND B.ISSUE_CODE = A.ISSUE_CODE AND B.JS_DATE = ' sql += date cur.execute(sql) issue_cd = cur.fetchall() for i in range(len(issue_cd)): result += issue_cd[i][0] print("%s result : %s "% (n,result)) cur.execute('SELECT INDTP_CODE FROM INDTP_INFO') indtp_cd = cur.fetchall() date = '20160415' for i in range(len(indtp_cd)): sum_indtp(indtp_cd[i][0], date)
[결과]
... 032604 result : 7800000.00 032605 result : 3900000.00 ...
2. 병렬 프로세서 이용
- 1번에서 생성한 함수에 병렬 프로세서를 사용하도록 수정하며 특정 일자부터 특정 일자까지 일별 합계를 구할 수 있도록 수정
import pp from datetime import datetime, timedelta import sys, socket, pymysql IpAddr = socket.gethostbyname(socket.gethostname()) conn = pymysql.connect(host=IpAddr, port=3306, user='root', passwd='root', db='STOCK',charset='utf8',autocommit=True) cur = conn.cursor() def sum_indtp(n, date): result = 0 conn = pymysql.connect(host=IpAddr, port=3306, user='root', passwd='root', db='STOCK',charset='utf8',autocommit=True) cur = conn.cursor() sql = 'SELECT B.CLOSE FROM J_MASTER A, J_DAILY B WHERE A.INDTP_CODE = ' sql += n sql += ' AND B.ISSUE_CODE = A.ISSUE_CODE AND B.JS_DATE = ' sql += date cur.execute(sql) issue_cd = cur.fetchall() for i in range(len(issue_cd)): result += issue_cd[i][0] return result ppservers = () if len(sys.argv) > 1: ncpus = int(sys.argv[1]) # Creates jobserver with ncpus workers job_server = pp.Server(ncpus, ppservers=ppservers) else: # Creates jobserver with automatically detected number of workers job_server = pp.Server(ppservers=ppservers) print("Starting pp with %s workers" % job_server.get_ncpus()) cur.execute('SELECT INDTP_CODE FROM INDTP_INFO') indtp_cd = cur.fetchall() fromdate = datetime.strptime('20160310','%Y%m%d') todate = datetime.strptime('20160415','%Y%m%d') date = fromdate jobs = [] while date <= todate: for i in range(len(indtp_cd)): input = (indtp_cd[i][0], "{:%Y%m%d}".format(date), IpAddr) jobs.append(job_server.submit(sum_indtp, input, (),("pymysql",))) date += timedelta(1) #print(jobs) job_server.wait() job_server.print_stats() cur.close()
[결과]
[python@localhost test]$ python test1.py 1 Starting pp with 1 workers Job execution statistics: job count | % of all jobs | job time sum | time per job | job server 4329 | 100.00 | 17.6993 | 0.004089 | local Time elapsed since server creation 21.862860918045044 0 active tasks, 1 cores [python@localhost test]$ python test1.py 2 Starting pp with 2 workers Job execution statistics: job count | % of all jobs | job time sum | time per job | job server 4329 | 100.00 | 8.5598 | 0.001977 | local Time elapsed since server creation 5.454913377761841 0 active tasks, 2 cores
'Programming' 카테고리의 다른 글
[Python] Google Map api를 활용한 주소 가져오기 (0) | 2017.03.16 |
---|---|
[Python]주식 종목 데이터 및 일별 시세 데이터 DB적재 (0) | 2016.04.22 |
Python Parallel로 DB 데이터 읽어오기 (0) | 2016.04.18 |
Python Parallel 예제 소스 분석 (0) | 2016.04.17 |
Python Parallel 설치하기 (0) | 2016.04.17 |