Python/보관

[Python/파이썬] CPU 개수 확인 (multiprocessing)

CODE.J 2022. 11. 15. 13:57
반응형
반응형

https://marketward.tistory.com/5

 

[Python/파이썬]네이버증권API 활용 - multiprocessing 사용 (4/4)

https://marketward.tistory.com/4 [Python/파이썬]네이버증권API 활용 - PER, PBR 기준으로 종목 검색(3/4) https://marketward.tistory.com/3 [Python/파이썬]네이버증권API 활용 - 네이버증권API + 종목코드로 json 결과 확인(2

marketward.tistory.com

위와 같이 multiprocessing을 사용할 때, 내 PC가 사용할 수 있는 최대 풀파워(최대 CPU)로 일이 빨리 처리되길 바랄 수 있습니다. 그리하여…
우선, Python의 multiprocessing 모듈에서 cpu_count() 메서드를 사용합니다.

from multiprocessing import cpu_count
print("최대 CPU 개수는 %s 입니다."%cpu_count())

결과 나왔습니다. 제 PC는 12개의 CPU를 사용하고 있는 것으로 보입니다.

앞서 포스팅한 "네이버증권API 활용" 코드에서 multiprocessing 시작 구분을 Pool(cpu_count())와 같이 처리하여 최대 CPU 개수가 입력되도록 했습니다.

import time
from multiprocessing import Pool
from multiprocessing import cpu_count
import pandas as pd
import json
import urllib.request
#한국거래소에서 종목 코드 받아옵니다. [0]은 헤더를 첫번째 행으로 지정하기 위해 사용 했습니다.
code_df = pd.read_html('http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13')[0]
#종목코드가 6자리이기 때문에 6자리를 맞춰주기 위해 설정해줍니다.
code_df.종목코드 = code_df.종목코드.map('{:06d}'.format)
#우리에게 필요한 회사명과 종목코드만 남깁니다.
code_df = code_df[['회사명', '종목코드']]
#리스트 형식으로 변경하면 네이버증권API 사용을 위한 준비가 끝납니다.
stock_list = code_df.values.tolist()

#multiprocessing을 위해 함수로 작성합니다.
def func(stock_set):
    #회사명을 가져옵니다.
    item_name = stock_set[0]
    #종목코드를 가져옵니다.
    item_code = stock_set[1]
    #네이버증권API인 요약 정보 기능을 사용 합니다.
    url = "https://api.finance.naver.com/service/itemSummary.nhn?itemcode=%s"%(item_code)
    #urllib.request를 통해 링크의 결과를 가져옵니다.
    raw_data = urllib.request.urlopen(url).read()
    #추후, 데이터 가공을 위해 json 형식으로 변경 합니다.
    json_data = json.loads(raw_data)
    #PER과 PBR을 변수로 지정합니다.
    per_value = json_data['per']
    pbr_value = json_data['pbr']
    #우선, PER 값이 있는 종목을 골라 냅니다.
    if per_value :
        #PER이 0보다 크고 2보다 작은 종목이면서 PBR이 0.7보다 작은 종목을 찾습니다.
        if 0 < per_value < 2 and 0.7 > pbr_value :
            print("[%s]의 per은 %s 입니다. (pbr %s)" %(item_name, per_value, pbr_value))

#func 함수를 stock_list 범위로 병렬 처리 합니다.
if __name__ == '__main__':
    start = time.time()
    #Pool(cpu_count()) 를 통해 PC의 최대 CPU 개수로 입력됩니다.
    with Pool(cpu_count()) as p:
        p.map(func, stock_list)
        
    print("\nCPU %s개를 사용 했습니다.\n"%cpu_count() + f"{time.time()-start:.4f} sec")

결과입니다. Pool(6)을 사용할 때보다 빨라진 것 같습니다.

반응형