파이썬 스크립트에서 시작시간이 좀 느려서 최적화를 해보았다.
파이썬에는 실행시간 측정을 위해 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이 짧은 cryptography나 pyaes로 대체 가능하다.
비동기 HTTP 클라이언트/서버 라이브러리인 aiohttp과 유사한 경량화 클라이언트인 aiosonic으로 교체해 보았지만 아쉬운 부분이 있어 aiohttp를 사용하기로 했다.
HTML 파싱을 위한 Beautiful Soup은 lxml으로 대체해서 200ms 단축하였다.
결과적으로 프로그램 시작 시간을 대략 300ms가량 아낄수 있었다.