본문 바로가기
코딩/기타

Go 언어(golang)와 파이썬의 for 반복문 실행 속도 비교

by 나홀로코더 2022. 3. 8.
반응형

목차

1. 주제 소개

2. 속도 비교


 

1. 주제 소개

아래 링크는 블로그 개설 초기에 올린 글이다. for 루프를 1억 번 돌면서 더하기 연산을 하는 데 걸리는 시간을 순수 파이썬 코드와 Numba 라이브러리를 적용한 코드 간에 비교했었다.

 

파이썬(Python) 속도를 100배, 1000배 빠르게 해주는 라이브러리(numba)

 

파이썬(Python) 속도를 100배, 1000배 빠르게 해주는 라이브러리(numba)

서론 ※ 시간이 없으면 바로 본론으로! 파이썬에 대해 공부하다보면 자주 보는 말이 있다. 파이썬이 요즘 대세이다, 파이썬은 배우기 쉽다, 파이썬은 활용 폭이 넓다 등등... 위와 같은 장점들과

codealone.tistory.com

 

간단한 코드 수정만으로 11배에서 5800배 빨라지는 효과를 봤었는데, 같은 내용을 최근에 배운 Go 언어로도 해보려고 한다.

 

 

반응형

 

2. 속도 비교

 

파이썬 버전은 이미 이전 글에서 보았으므로 다시 여기에 소개하거나 실행해보지 않겠다.

 

아무 의미 없는 1억 번의 더하기 연산 작업을 순수 파이썬으로 했을 때 11.5초가 걸렸었다.

 

같은 연산 작업을 Go로 해보자. 코드는 아래와 같다. 시간을 측정하기 위해 time 패키지도 사용한다.

 

package main

import (
	"fmt"
	"time"
)

func main() {
	start := time.Now()
	var a int
	for i := 0; i < 10000; i++ {
		a += i
		for j := 0; j < 10000; j++ {
			a += j
		}
	}
	fmt.Println(a)
	fmt.Println(time.Since(start))

}

 

go run main.go 명령어로 위 코드를 실행해 본 결과는 아래와 같다.

 

 

아무 의미 없지만 파이썬과 동일한 연산 결과를 출력해주고 있고, 74.6383 밀리초가 걸렸다. 밀리초는 천 분의 일 초이므로 0.0746383초가 걸린 셈이다.

 

11.5...초를 0.074... 초로 나누어 보니 154.337... 이 나온다. 150배 이상 빠르다.

 

반응형

 

한편 Go는 go run 명령어로 스크립트를 바로 실행할 수도 있지만 파이썬과 달리 컴파일 언어이기 떄문에 go build 명령어로 .exe 파일을 손쉽게 만들 수 있다.

 

미리 컴파일한 뒤 .exe 파일을 실행하면 더 빠르지 않을까 생각한 것과 달리, 위 코드에 따라 측정되는 시간은 차이가 나지 않는다. 여러 번 실행해 보았는데 50~120 밀리초가 나온다.

 

go run 명령어로 스크립트를 실행하면 컴파일할 시간이 필요하므로 실제로 코드가 실행되기까지 약간의 지연이 있지만, 위에 작성한 스크립트에서는 코드가 이미 실행된 후부터 시간이 측정되므로 두 방식이 차이가 나지 않는 것처럼 보이는 것 같다. 

 

그러나 go run 명령어를 입력하고 실제로 계산 결과가 나오는 데는 어림잡아 1~2초가 걸리는 반면, .exe 파일은 이미 컴파일된 코드를 실행만 하면 되므로 실제로 소요되는 시간은 훨씬 짧다. main.exe 명령어를 입력하는 즉시 결과가 출력된다.

 

커맨드라인에 명령어를 입력하는 순간부터 시간을 측정하는 방법은 알지를 못해서, 이 정도 설명으로 그치겠다.

 

 

1억 회 연산 10회 반복하기

 

이번에는 위의 1억 회 덧셈 연산을 10회 반복하는 데 걸리는 시간을 보자.

 

Go 루틴을 활용할 것이다. Go 루틴에 관해서는 아래 게시글에서 소개한 바 있으니 참고하기 바란다.

 

Go 언어(golang)로 파이썬보다 속도가 n배 빠른 웹스크레이퍼(크롤러) 만들기

 

Go 언어(golang)로 파이썬보다 속도가 n배 빠른 웹스크레이퍼(크롤러) 만들기

목차 1. 주제 소개 2. 웹스크레이퍼 파이썬 버전 소개 3. golang으로 웹스크레이퍼 빠르게 만들기 1. 주제 소개 꽤 시간이 지난 일이지만 필자는 이 블로그에 파이썬을 이용한 웹스크레이핑 방법을

codealone.tistory.com

 

package main

import ("fmt"; "time")

var num int

func main() {
	now := time.Now()

	c := make(chan int)

	num = 0

	for i := 0; i < 10; i++{
		go loop(num, c)
	}

	for j := 0; j < 10; j++{
		fmt.Println(<-c)
	}

	fmt.Println(time.Since(now))
}

func loop(num int, c chan int) {
	for i := 0; i < 10000; i++ {
		num += i
		for j := 0; j<100000; j++{
			num += j
		}
	}
	c <- num 
}

 

위와 같이 작성한 후 실행해보니 120~150 밀리초가 걸린다.

 

파이썬에서 1억회 연산 1번에 11초가 넘게 걸렸으니 그 연산 횟수의 차이를 고려하면 대단한 속도이다.

(참고로 앞에서 본 코드는 필자의 노트북에서, 이 코드는 필자의 스마트폰에서 실행했다.)

 

 

이번에는 10억 회 연산을 10번 하는 것을 시도해 보니 1.2초 정도가 걸린다. 연산 횟수는 100배가 많지만 시간은 10분의 1밖에 안 걸린다.

 

 

Go 언어는 파이썬에 비하면 약간은 문법이 더 복잡하지만, 기본적으로 실행 속도가 빠른 데다가 Go 루틴으로 동시성 프로그램을 매우 간단히 만들 수 있다는 점에서 매력적인 것 같다.

반응형

댓글