R에서 만든 코드를 속도를 좀 빠르게 해보겠다며 며칠간 고생해서 Python 코드로 변경을 했는데, 돌려보니 오히려 시간이 더 걸린다. 필수적이지 않는 여러 기능들, 가령 progress bar 등도 추가하고 멋지게 만들기는 했는데 최적의 coding은 아닌것 같다.
그래서 ChatGBT 교수님 (어제 내가 비서에서 교수로 승진시꼈다)에 ChatGPT에 나의 코드를 복사해서 입력하고, 나의 코드가 너무 늦으니 좀 빠르게 돌립 방법은 없는지에 대한 추천을 부탁했다.
거짓말처럼 5초도 않되어서 답변이 나오기 시작했다. 남의 코드를 이렇게 빨리 이해하고 solution을 낸다는 것이 얼마나 어려운지 내가 잘 아는데 정말 상상이상이다.
다음은 내가 받은 답변이다.
The performance of your code can be improved in the following ways:
1. Avoid using the time.sleep function. It is adding unnecessary delay to your code and slowing down the overall performance.
2. Use Numpy broadcasting to avoid the for loop in cv_sadf. The expression [np.max(badfs[:,i]) for i in range(m)] can be replaced with np.max(badfs, axis=1).
3. Consider reordering the loops to minimize the number of function calls to My_ADF_FL:
sadf=np.ones([m,1])
for i in tqdm(range(swindow0,T),desc='1st loop'):
for j in tqdm(range(m),desc='2nd loop',leave=False):
data=y[0:i,j]
ADF=My_ADF_FL(data,adflag=8,mflag=2)
badfs[j,i-swindow0]=ADF
4. Finally, consider parallelizing the code if possible to speed up the execution.
1번은 time.sleep이라고 loop이 돌때마다 시간을 알려주는 기능을 삭제해라는 추천이고
(origianl 1회 : 60초, time.sleep을 제거 했을 때 3초 .... 20배가 빨라짐. 헐~~~)
2번은 for loop 등에서 내가 만든 코드보다는 가능하면 numpy 함수를 사용하라는 추천이다.
(2.9초로 큰 차이는 없다. 하지만 1000 회등은 이야기가 달라질 듯)
3번은 for i, for j의 순서를 바꾸어 보 것을 권했다. (사실 10회 등 작은 숫자의 loop에서는 오히려 나의 코드가 더 빨랐지만 100회 이상이 되면서 이 방법이 더 빨라진 것을 알았다.
(j, i의 경우 100회 298초, i,j의 경우 100회 296초로 차이가 줄었고, 1000회라면 후자가 더 빠를 것 같다. 역시 교수님급 추천이다....)
4.번은 Parallel (병합계산법이다. 나는 아주 오래된 i-7을 돌리고 있는데 12개이 프로세서가 있는데 20%로 CPU를 사용하고 있다. 그래서 오늘 파이썬에서 이 기능을 추가하려 했었다. 그리고 R에도 이 기능이 있으므로 Python이 특별이 더 빨를 것은 아닐것 같다.
결론적으로 ChatGPT는 엄청난 량의 Data및 다양한 사례의 Sample code를 다루어 본 경험이 있고, 상당한 수준의 고수준들이 지적을 하면서 error가 발생하는 다양한 패턴들을 알고리즘화 했으며, 속도가 느리다면 tree형으로 for loop을 사용하는가 yes, no하는는가? ==> No ==>다음==>......parallelizing을 쓰는가? "No면 4번 comment를 추가해라"하는 식으로 추천을 해주는것 같다.
결론적으로 위대한 tool을 만난것 같고, 박사등 연구자에게는 Literature 추천, 논문작업에 필요한 Coding, 영문번역 등 충실한 비서가 최소한 여러명 제공될 것이다. 행후 유료화가 되면, 시간당 1불 등 사용료도 만만치 않을 것 같다.