파이썬 스크립트에서 시작시간이 좀 느려서 최적화를 해보았다.

파이썬에는 실행시간 측정을 위해 cProfile-X importime 과 같은 좋은 기능이 있다.

여기서는 먼저 라이브러리 시작시 로딩 시간을 알아보기 위해 사용되는 라이브러리를 확인했다.

$ grep import * | cut -d: -f2 | cut -d\  -f2 | sort | uniq

aiohttp
argparse
asyncio
concurrent.futures
...

간단한 스크립트로 사용되는 라이브러리들의 import time을 확인했다.

#!/bin/bash
for module in aiohttp argparse asyncio \
        concurrent.futures Cryptodome.Cipher \
        datetime getpass json lxml operator \
        os random re sqlite3 subprocess sys \
        time tomli websockets bs4
do
        (time python3 -c "import $module") 2>&1 | \
        awk "/real/ {print sprintf(\"%-20s\", \"$module\") \$2}"
done | sort -drk 2

결과는 다음과 같다.

aiohttp             0m0.375s
bs4                 0m0.225s
Cryptodome.Cipher   0m0.159s
asyncio             0m0.084s
concurrent.futures  0m0.036s
tomli               0m0.033s
websockets          0m0.027s
argparse            0m0.027s
subprocess          0m0.026s
json                0m0.025s
re                  0m0.023s
sqlite3             0m0.021s
getpass             0m0.021s
random              0m0.018s
datetime            0m0.017s
lxml                0m0.016s
operator            0m0.015s
sys                 0m0.015s
time                0m0.014s
os                  0m0.014s

aiohttp, beautifulsoup, Cryptodome 세 라이브러리만 벌써 750ms 이상 사용하고 있었다.

AES 암호화를 위한 Cryptodome.Cipher는 당장 필요가 없어 제거했다. 필요한 경우 import time이 짧은 cryptographypyaes로 대체 가능하다.

비동기 HTTP 클라이언트/서버 라이브러리인 aiohttp과 유사한 경량화 클라이언트인 aiosonic으로 교체해 보았지만 아쉬운 부분이 있어 aiohttp를 사용하기로 했다.

HTML 파싱을 위한 Beautiful Souplxml으로 대체해서 200ms 단축하였다.

결과적으로 프로그램 시작 시간을 대략 300ms가량 아낄수 있었다.