C/C++의 double형은 수치 해석 분야의 기본적인 자료형이다. float형은 정밀도가 떨어지므로 주로 이 자료형이 사용되며 GPU도 이 자료형의 계산을 고속으로 수행하도록 설계된 것으로 알려져 있다.


 그런데 long long int 형은 8바이트 정수형 자료형인데 단순 곱셈의 경우 수행 속도에 시간 차가 많이 난다. 다음과 같은 간단한 c++ 프로그램을 내 노트북에서 실행시켜서 확인해 보았다.


#include  <stdio.h>
#include <time.h>
#define ITER 100000000 //1억번
int main() {
clock_t clkStart, clkEnd;
double dt1, dt2;
clkStart = clock();
double da = 10.1, db=11.2;
for (long k=0; k<ITER; k++) {da*=db;}
clkEnd = clock();
printf("%.3f sec\n", dt1=((double)clkEnd-clkStart)/CLOCKS_PER_SEC);

clkStart = clock();
long long lla = 101, llb=112;
for (long k=0; k<ITER; k++) {lla*=llb;}
clkEnd = clock();
printf("%.3f sec\n", dt2=((double)clkEnd-clkStart)/CLOCKS_PER_SEC);
printf("%.2f percent", dt2/dt1*100);
}


이 프로그램은 단순히 double형 두 개를 곱셈 후 대입하는 동작 1억 번과 long long 형 덧셈 후 대입하는 동작 1억 번의 수행 시간을 구하는 것이다.  결과는 다음과 같이 후자가 전자 대비 3%의 시간밖에 걸리지 않았다.



 문제는 GPU 기반의 라이브러리인 CUDA에서 정수형 연산도 실수형 만큼 효율적인가 하는 것이다. 하지만 그러지 않더라도 나름 의미가 있지 않을까.





Posted by 살레시오
,

 파이썬에서는 문자열끼리 더하거나 곱할 수 있다. 문자열끼리 연결하는데  덧셈 연산자를 사용하는 것은 다른 언어에서도 흔하지만 곱셈은 독특하다.  두 개의 문자열을 더하면 문자열이 하나로 합해진 새로운 문자열이 만들어진다.


>>> “My name is “+”Salesio.”
>>> q = “ipython”
>>> r = “ is useful.”
>>> s = q+r


이 예제에서 원래의 문자열 q와 r은 더하기 연산으로 변경되지 않는다. 앞에서도 밝혔듯이 문자열은 한 번 내용이 정해지면 그 다음에는 변경할 수 없다. (이러한 자료형을 immutable 자료형이라고 한다.)  다만 연산의 결과로 새로운 문자열이 생성되는 것이다.  만약


>>>s = ’Life is long.’


에서 long이라는 단어를 short로 바꾸고 싶다면 슬라이싱을 이용해서 다음과 같이 할 수 있다.


>>> s = s[:8] + ’short.’


이 경우 원래 문자열이 바뀌는 것이 아니라 기존의 문자열은 모두 삭제되고 새로 생성된 문자열이 다시 변수 s에 저장되는 것이다. (사실 변수 s 는 문자열에 대한 참조가 저장된다. 이 경우 참조, 즉 주소가 새로 생성된 문자열의 그것으로 바뀌는 것이다.)


 유사하게 문자열에 정수를 곱하면 정수만큼 반복되는 새로운 문자열을 생성한다.


>>> “blah “*5

blah blah blah blah blah

>>> ‘=’*50

==================================================


위에서 두 번째 예는 화면에 출력할 때 간단히 구분선을 만드는 용도로 사용된다.



Posted by 살레시오
,