반응형

Python 3.14는 C++보다 빠를 것입니다

https://towardsdatascience.com/python-3-14-will-be-faster-than-c-a97edd01d65d

 

Python 3.14 will be faster than C++

Benchmarking the new and impressive Python 3.11

towardsdatascience.com

새롭고 인상적인 Python 3.11 벤치마킹

Python은 데이터 과학(DS) 및 기계 학습(ML)에서 가장 많이 사용되는 스크립팅 언어 중 하나입니다. ' 프로그래밍 언어의 인기도 '에 따르면 Python은 Google에서 가장 많이 검색되는 언어입니다. 다양한 DS/ML 솔루션을 함께 연결 하는 훌륭한 글루 언어일 뿐만 아니라 데이터로 거의 모든 작업을 수행할 수 있는 많은 라이브러리가 있습니다.

약 한 달 후에 우리는 Python의 새로운 연간 릴리스: 버전 3.11을 얻습니다. 이 버전의 주요 기능은 속도가 크게 향상되었기 때문에 이 새 버전에 대해 매우 흥분됩니다.

LinkedIn에서 나는 이미 새 버전을 테스트하는 두 사람의 게시물을 보았고 그 결과는 놀라웠습니다. 그러나 Python 3.11이 진정으로 얼마나 빠른지 느낄 수 있는 가장 좋은 방법은 테스트를 직접 실행하는 것입니다.

이 게시물에서는 Python 3.11에 대한 단계별 분석을 공유합니다. 모든 코드는 내 github 페이지 에서 사용할 수 있습니다 .

Unsplash  Spencer Davis 사진

프로그래밍 언어를 벤치마킹하는 것은 결코 쉬운 일이 아닙니다. x 가 y 보다 빠르다는 것을 읽을 때 항상 결과를 소금 한 알로 받아들여야 합니다. 알고리즘의 한 구현은 x 보다 더 좋을 수 있고 다른 구현은 y 에서 더 나을 수 있습니다 . 벤치마크의 경우 Python에 대해 Python을 테스트할 때 조금 더 간단하지만 약간만 영향을 받는 언어의 요소를 선택했을 수 있습니다. 이를 염두에 두고 내가 벤치마킹에 사용한 알고리즘인 Monte Carlo 방법을 사용한 Pi 추정을 제시하고자 합니다.

이 알고리즘의 아이디어는 간단하지만 대학에서 수학 과정에서 처음 보았을 때 마음이 흔들렸습니다. 크기가 2r 인 정사각형이 있고 이 정사각형에 반지름이 r 인 원을 맞춥니다 . 이제 평면에서 숫자를 생성하는 난수 생성기를 사용합니다. <-r, r>, <-r, r> . 원에 있는 점과 정사각형에 있는 점 사이의 비율(읽기: 모든 점)은 면적 비율의 근사치로 Pi를 근사하는 데 사용할 수 있습니다. 이것은 방정식에서 조금 더 명확합니다.

그림 1: Pi를 추정하기 위한 Monte Carlo 방법의 파생. 두 영역 간의 비율은 Pi/4이므로 Pi는 N_circle/N_all의 약 4배입니다. (저자의 이미지).

Python에서는 테스트를 반복하고 평균을 취할 수 있도록 테스트 스크립트에서 실제 추정치를 분할했습니다. 여기에 표시되지는 않았지만 명령줄 인터페이스(CLI)에서 인수를 구문 분석하는 표준 라이브러리인 Argparse 를 사용하여 스크립트를 매개변수화했습니다 . Python 코드는 다음과 같습니다.

def estimate_pi(
    n_points: int,
    show_estimate: bool,
) -> None:
    """
    Simple Monte Carlo Pi estimation calculation.
    Parameters
    ----------
    n_points
        number of random numbers used to for estimation.
    show_estimate
        if True, will show the estimation of Pi, otherwise
        will not output anything.
    """
    within_circle = 0

    for _ in range(n_points):
        x, y = (random.uniform(-1, 1) for v in range(2))
        radius_squared = x**2 + y**2

        if radius_squared <= 1:
            within_circle += 1

    pi_estimate = 4 * within_circle / n_points

    if not show_estimate:
        print("Final Estimation of Pi=", pi_estimate)


def run_test(
    n_points: int,
    n_repeats: int,
    only_time: bool,
) -> None:
    """
    Perform the tests and measure required time.
    Parameters
    ----------
    n_points
        number of random numbers used to for estimation.
    n_repeats
        number of times the test is repeated.
    only_time
        if True will only print the time, otherwise
        will also show the Pi estimate and a neat formatted
        time.
    """
    start_time = time.time()

    for _ in range(n_repeats):
        estimate_pi(n_points, only_time)

    if only_time:
        print(f"{(time.time() - start_time)/n_repeats:.4f}")
    else:
        print(
            f"Estimating pi took {(time.time() - start_time)/n_repeats:.4f} seconds per run."
        )
view rawsingle_test_run_PARTLY.py hosted with ❤ by GitHub

이 스크립트는 실행할 준비가 되었지만 현재 설치된(또는 활성화된) 버전뿐만 아니라 다양한 버전의 Python을 테스트하는 데 이 스크립트를 사용하려고 합니다. 여러 버전의 Python을 테스트하는 가장 쉬운 방법은 Docker를 사용하는 것입니다. Python은 많은 도커 이미지를 유지 관리 합니다. 당연히 모든 버전이 지원되지만 2.7 또는 3.2와 같은 EOL(End-of-Life) 버전도 지원됩니다. 버전 3.11과 같은 릴리스 후보에 대한 이미지도 있습니다. Docker를 사용하려면 Docker가 설치되어 있어야 합니다. Linux와 Mac에서는 비교적 쉽습니다. Windows에서는 확실하지 않지만 어렵지는 않을 것입니다. 도커 CLI만 설치하는 것이 좋습니다. 데스크탑은 저에게 너무 부풀려져 있습니다. 컨테이너화된 Python 환경에서 로컬 스크립트를 실행하려면 다음을 실행하십시오.

도커 실행 -it --rm \ 
  -v $PWD/your_script.py:/your_script.py \ 
  python:3.11-rc-slim \ 
  python /yourscript.py

다양한 버전에 대한 테스트를 자동화하기 위해 물론 Python도 사용합니다. 이 스크립트는 특정 Python 버전으로 컨테이너를 시작하는 하위 프로세스 를 시작하고 나중에 결과를 수집합니다. 특별한 것은 없습니다:

def test_version(image: str) -> float:
    """
    Run single_test on Python Docker image.
    Parameter
    ---------
    image
        full name of the the docker hub Python image.
    Returns
    -------
    run_time
        runtime in seconds per test loop.
    """
    output = subprocess.run([
            'docker',
            'run',
            '-it',
            '--rm',
            '-v',
            f'{cwd}/{SCRIPT}:/{SCRIPT}',
            image,
            'python',
            f'/{SCRIPT}',
            '--n_points',
            str(N_POINTS),
            '--n_repeats',
            str(N_REPEATS),
            '--only-time',
        ],
        capture_output=True,
        text=True,
    )

    avg_time = float(output.stdout.strip())

    return avg_time


# Get test time for current Python version
base_time = test_version(NEW_IMAGE['image'])
print(f"The new {NEW_IMAGE['name']} took {base_time} seconds per run.\n")

# Compare to previous Python versions
for item in TEST_IMAGES:
    ttime = test_version(item['image'])
    print(
        f"{item['name']} took {ttime} seconds per run."
        f"({NEW_IMAGE['name']} is {(ttime / base_time) - 1:.1%} faster)"
    )
view rawrun_main_test_py11.py hosted with ❤ by GitHub

이러한 테스트를 실행할 때 절대값은 프로세서(CPU 과중)에 따라 시스템마다 다릅니다. 다음은 마지막 7개의 주요 Python 버전에 대한 결과입니다.

새로운 Python 3.11은 실행당 6.4605초가 걸렸습니다.Python 3.5는 11.3014초가 소요되었습니다.(Python 3.11은 74.9% 빠름) 
Python 3.6은 11.4332초가 소요되었습니다.(Python 3.11은 77.0% 더 빠름) 
Python 3.7은 10.7465초가 소요되었습니다 
. (Python 3.11은 74.9% 빠름) 3.11은 65.5% 빠름) 
Python 3.9는 10.9537초가 소요되었습니다.(Python 3.11은 69.5% 빠름) 
Python 3.10은 8.8467초가 소요되었습니다.(Python 3.11은 36.9% 빠름)

벤치마크는 Python 3.11의 경우 평균 6.46초가 소요되었습니다. 이를 이전 버전(3.10)과 비교하면 거의 37% 더 빠릅니다. 꽤 인상적입니다! 버전 3.9와 3.10 간에 거의 동일한 차이가 있어 3.11이 거의 70% 빨라졌습니다! 나는 그림 2에서 모든 시간을 플로팅했습니다.

그림 2: 테스트한 모든 Python 버전의 평균 루프 시간. (저자의 이미지).

속도에 대해 이야기할 때 항상 한 사람이 말합니다. 속도를 원하면 C를 사용하지 마십시오.

C는 Python보다 훨씬 빠릅니다! — 그 한 사람

내 C는 녹슬었지만 어쨌든 시도해 볼 생각입니다. 좋은 시간 측정 라이브러리(크로노)와 함께 제공되는 GNU C++를 사용했습니다. 아래 코드를 찾으십시오.

#include <stdlib.h>
#include <stdio.h>
#include <chrono>
#include <array>

#define N_POINTS 10000000
#define N_REPEATS 10

float estimate_pi(int n_points) {
   double x, y, radius_squared, pi;
   int within_circle=0;

   for (int i=0; i < n_points; i++) {
      x = (double)rand() / RAND_MAX;
      y = (double)rand() / RAND_MAX;

      radius_squared = x*x + y*y;
      if (radius_squared <= 1) within_circle++;
   }

   pi=(double)within_circle/N_POINTS * 4;
   return pi;
}

int main() {
    double avg_time = 0;

    srand(42);

    for (int i=0; i < N_REPEATS; i++) {
        auto begin = std::chrono::high_resolution_clock::now();
        double pi = estimate_pi(N_POINTS);
        auto end = std::chrono::high_resolution_clock::now();
        auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
        avg_time += elapsed.count() * 1e-9;
        printf("Pi is approximately %g and took %.5f seconds to calculate.\n", pi, elapsed.count() * 1e-9);
    }

    printf("\nEach loop took on average %.5f seconds to calculate.\n", avg_time / N_REPEATS);
}
view rawpi_estimate.c hosted with ❤ by GitHub

우리 모두 알고 있듯이 C++는 컴파일된 언어이므로 소스를 사용하려면 먼저 컴파일해야 합니다. 일반이 build-essentials설치된 경우 다음을 입력할 수 있습니다.

g++ -o pi_estimate pi_estimate.c

컴파일 후 빌드 실행 파일을 실행하기만 하면 됩니다. 출력은 다음과 같아야 합니다.

Pi는 약 3.14227이고 계산하는 데 0.25728초가 걸렸습니다. 
Pi는 약 3.14164이고 계산하는 데 0.25558초가 걸렸습니다. 
Pi는 약 3.1423이며 계산하는 데 0.25740초가 소요되었습니다. 
Pi는 약 3.14108이고 계산하는 데 0.25737초가 걸렸습니다. 
Pi는 약 3.14261이며 계산하는 데 0.25664초가 소요되었습니다.각 루프는 계산하는 데 평균 0.25685초가 걸렸습니다.

그리고 우리는 그것이 정말로 (읽기: REALLY) 빠르기 때문에 그 한 사람 과 동의해야 합니다 . 이전에 Python에서 프로그래밍한 것과 동일한 루프를 수행하는 데 0.257초밖에 걸리지 않았습니다. 이것을 그림 3과 같이 이전 플롯의 선으로 추가해 보겠습니다.

그림 3: C++로 컴파일된 동일한 벤치마크와 비교한 Python 버전. (저자의 이미지).

이제 이전 수치를 조금 더 오래 감상한 후 Python이 얻은 추진력을 분명히 볼 수 있습니다. 버전 3.9 이후로 Python은 속도가 약 35% 증가했습니다. Python 개발자는 다음 몇 가지 버전에서 상당한 속도 증가가 있을 것이라고 언급했으므로 이 속도가 유지될 것이라고 가정할 수 있습니다(  , 매우 안전한 가정).

이제 문제는 이 모멘텀이 고정된 상태에서 Python이 C++의 시간을 언제 능가할 것인가입니다. 이를 위해 우리는 물론 외삽을 사용하여 다음 Python 버전의 루프 시간을 예측할 수 있습니다. 이는 그림 4에서 볼 수 있습니다.

그림 4: Python 속도 추정 -> Python 3.14는 속도 면에서 C++를 능가합니다. 놀라운! (저자의 이미지).

결과는 정말 놀랍습니다! 이 속도를 유지하면 Python 3.14가 C++보다 빠를 것입니다. 정확히는 루프 시간이 -0.232 초가 되므로 계산을 하기 직전에 완료됩니다. 시공간 연속체에 구멍이 있는 것처럼 보이지만 이러한 계산은 확고합니다. 그러므로 우리는 아인슈타인과 친구들의 작업에 의문을 제기해야 할 수도 있다고 생각합니다.

반응형
반응형

기억해두세요, 최고의 C++ 강의 5개  http://www.bloter.net/archives/271078

 

C++ 언어는 오랜 역사와 탄탄한 사용자 층, 그리고 고유한 지지 및 사용 기반을 가진 프로그래밍 언어입니다. 특정한 회사에 속해있지 않은 까닭에 C++ 컨퍼런스는 다양한 단체와 기구에서 주최되고 있는데요. 그 중 전세계 대표적인 C++ 컨퍼런스에는 아래 5개를 들 수 있습니다.

  • Cppcon
  • C++ and Beyond
  • Meeting C++
  • The ACCU Conference
  • C++Now

출처 : informit.com (자세한 비교 분석은 이 링크를 참고해주세요.)

 

 

 

션 페어런트를 강의를 무료로 볼 수 있는 곳

 

스콧 마이어스의 ‘이펙티브 C++’ 시리즈 돌아보기

 

CppCon 2016: Nicholas Ormrod “The strange details of std::string at Facebook” 영상 링크

 

스테픈 T. 라와웨이드의 STL 강의 링크

 

케이트 그레고리의 Stop Teaching C 영상

 

 

.......

반응형
반응형

Cocos2d-x 통합 프로젝트 생성 - http://cocos2d-x.org/

 

C++ 기반 크로스 플렛폼 엔진 Cocos2d-x

 - Unity3D, Corona SDK 등도 있다.

 

Cocos2d-x 는 오픈소스이고 C++,Lua, javascript 등의 언어로 개발할 수 있다.

지속적인 업데이트가 이루어지고 있으며, 이미 Cocos2d-x에 기반을 둔 다양한 상용 게임들이

출시돼있어 신뢰성에서도 높은 점수를 받고 있다.

 

iOS, 안드로이드, 윈도우포, 바다, 블랙베리 등 다양한 플랫폼을 지원한다.

 

Refference : http://www.cocos2d-x.org/reference/native-cpp/index.html

 

 [Cocos2d-x] 2.0.x 버젼 통합 프로젝트(iOS & Android) 만들기

 

 

Android NDK

 : 안드로이드를 C++로 개발할때 필요함.

 

안드로읻 NDK는 안드로이드 SDK와 함께 구글에서 제공하는 개발킷으로, 안드로이드 애플리케이션에 있는

네이티브 코드의 구성 요소들을 포함할 수 있게 해준다.  안드로이드 NDK에는 컴파일러 및 링커가 포함된

툴 체인, 헤더 파일, 라이브러리, 문서, 예제프로그램 등이 포함돼있다.

http://developer.android.com/tools/sdk/ndk/

반응형

+ Recent posts