알고리즘 프로그래밍을 위해 C보다 Python 선호


16

나는 약간의 알고리즘을 연구하고 있으며 SPOJ.pl TopCoder와 같은 사이트를 살펴 보았습니다. 프로그래머는 대부분의 알고리즘 프로그래밍 경연 대회에서 C 또는 C ++를 선호한다는 것을 알았습니다.

나는 최근에 어려움을 겪고있다. 나는 약간의 C와 Python을 알고 있으며 코드를 작성할 때 대부분의 알고리즘에서 C보다 Python을 선호하는 것 같습니다. CI에서 코드를 작성하기 위해 앉을 때마다 약 15 분 후에 포기합니다. 왜냐하면 너무 번거롭고 파이썬으로 이동하는 경향이 있기 때문입니다. 행렬 전달 포인터 등은 실제로 알고리즘 자체에 대해 생각하는 데 활용할 수있는 시간 낭비입니다.

이제 저는 많은 사람들로부터 C가 매우 중요한 언어이며 많은 프로그래머의 빵과 버터라는 것을 알고 들었습니다.

내가 알고 싶었던 것은이 접근법에 단점 / 결과 / 단점 등이 있는지 여부였습니다.

이것은 파이썬 대 C 토론이 아닙니다. 사용하기 쉽기 때문에 C보다 파이썬을 선호하는 특정 관행이 나 또는 다른 프로그래머 / 컴퓨터 과학자에게 장기적으로 영향을 미치는 방법에 대한 질문입니다.


업계에서 이러한 언어를 사용하거나 대규모 소프트웨어 / 라이브러리 등을 개발 한 사람들의 의견을 듣고 싶습니다.


이 주제는이 토론에 대한 링크가 없으면 완료되지 않습니다. lukeplant.me.uk/blog/posts/…
permeakra

11
@ permeakra : 기본적으로 Haskell과 Python을 배우는 것이 다른 언어가 빨라서 다른 언어에서 더 나아지지 않는다는 것을 나타내는 말입니다.
Robert Harvey

파이썬과 하스켈이 사용자의 마음에 어떻게 영향을 미치는지에 대한 설명과 그 주제에 대한 다른 사람들의 많은 의견이 포함되어 있기 때문에 그것은 단지 열정이 아닙니다. 그러나 c를 저수준 언어로 사용하지는 않지만 조금 더 높은 수준의 언어이지만 아이디어는 동일합니다. 다른 언어의 아이디어를 현재 작업중 인 언어로 가져와 코드를 비 아이디어로 만듭니다. . 좋은 일이지만…
permeakra


이 것이 무엇이든간에 비 알고리즘 프로그래밍 을 보는 것이 흥미 로웠을 것입니다.
SK-logic

답변:


14

내 경험에 따르면 사람들이 C에서 알고리즘을 코딩하는 데 어려움이있을 때 종종 적절한 추상화를 만드는 대신 데이터 구조 관리를 알고리즘과 밀접하게 결합하기 때문입니다. 예를 들어, 작성 push()pop()기능 대신 어디서나 링크 된 목록 포인터를 수동으로 조작 합니다. 그들은 그러한 추상화를 제공하는 데 너무 익숙합니다.

이 문제는 낮은 수준의 추상화에서 훨씬 더 분명하지만, 밀접한 결합을 인식하고 적절한 추상화를 생성하지 못하면 모든 수준에서 문제가됩니다. 깨끗하고 읽기 쉬운 알고리즘을 만들 수있을 때까지 C에서 이러한 기술을 연습하면 사용하는 모든 언어로 넘어갑니다.

파이썬 프로그래머들 사이에서 종종 보게되는 다른 문제는 규모에 맞게 성능을 조정하는 데 어려움이 있습니다. 물론 성능은 일반적으로 주요 관심사가 아니지만 상대적으로 작은 데이터 구조에 대한 알고리즘을 구현하는 가장 비법적인 방법은 기가 바이트 이상의 데이터로 작업 할 때 시스템을 정지시킬 수 있습니다. 훌륭한 C 프로그래머가되면 어떤 언어로든 이런 종류의 문제를 더 잘 알 수 있습니다.

다른 언어로 그 기술을 배울 수 있습니까? 물론, C는 잘못했을 때 훨씬 더 명확하게함으로써 도움이됩니다.

즉, C에 익숙한 것처럼 선택을 할 때 알고리즘 프로그래밍에 파이썬을 사용합니다. 파이썬에는 그러한 종류의 프로그래밍에 매우 좋은 언어 기능이 있으며 성능 차이는 대개 무시할 수 있습니다. 둘 다 알고있는 다른 프로그래머가 C를 선택하는 이유에 대해서는 말할 수 없습니다. 많은 사람들이 단순히 군중과 차별화하기 위해 그렇게한다고 생각합니다.


1
"그들은 추상을 제공하는 데 너무 익숙하다." 이것은 내가 C보다 먼저 파이썬을 배웠으므로 그 줄을 따라 적응할 수 없거나 무언가를 할 수 없다고 가정합니까?
ffledgling

10

프로그래밍에 관심이없는 연구원은 C와 같은 언어로 솔루션을 더 쉽게 코딩 할 수 있기 때문에 Python과 같은 고급 언어를 선호합니다. "배터리 포함"및 NumPy 및 SciPy와 같은 숫자 라이브러리와 통합됩니다.

연구원이 더 나은 성능을 필요로하는 경우, 일반적으로 Python에서 작성한 알고리즘을 소프트웨어 엔지니어에게 넘겨 주어 소프트웨어 엔지니어는이를 최적화하는 방법을 찾을 수 있습니다 (C 로의 코딩 및 코딩 포함).


기본적으로 연구원과 소프트웨어 엔지니어는 디자이너와 장인의 관계를 가지고 있습니까? 그리고 업계에서 두 유형의 사람들의 활용은 어떻습니까?
ffledgling

9
테이크 아웃은 파이썬으로 알고리즘을 코딩 한 다음 C 로보 다 세련된 구현을 작성하는 것이 완벽하게 수용 가능한 시나리오라고 생각합니다.
Robert Harvey

또는 "Cython으로 레코딩"?
endolith

10

SPOJ.pl, ACM 경쟁 및 모든 유사한 경쟁은 경쟁 직후 폐기 될 작업 코드를 빠르게 생성하는 데 중점을 둡니다. TopCoder는이 작업을 수행하지만 더 작은 정도입니다 (코드는 최소한 OO- 디자인 수준에서 적절하게 구성되어 있습니다).

그러나 프로그래밍의 실제 세계에서 알고리즘 프로그래밍 경쟁에서 취하는 거의 모든 지름길은 반 패턴입니다. 이 점을 명심해야 모든 종류의 비교를 할 수 있습니다. 예를 들어, 다른 함수간에 다차원 배열을 전달하십시오. 경쟁 환경에서 가장 좋은 방법은 적절한 통화 세부 정보를 파악하는 시간을 절약하기 위해 어레이를 전역으로 선언하는 것입니다 (예 : 크기를 전달해야합니까, 아니면 결정할 수 있습니까?). 실제 프로그래밍에서는 정반대입니다.

따라서 귀하의 질문에 따르면 알고리즘 대신 C 대신 Python을 선택하면 복잡한 결과가 발생합니다. 알고리즘에만 관심이 있다면 Python과 C에서 동일한 작업을 수행합니다. 함수형 언어로 구현하면 약간의 차이가 발생할 수 있지만 알고리즘은 여전히 ​​동일합니다.

실제로 C에서 알고리즘을 구현하여 얻은 유일한 것은 실행에 대한 제어력을 높이고 하위 수준 추상화를 사용한다는 보장입니다. 파이썬에는 많은 복잡성이 숨겨져 있기 때문에 작은 것이 아닙니다. 그러나 문제가 상위 레벨 추상화에서 사소한 것이 아니라면 실행 속도를 잃을 수도 있으며 대부분의 경우 실제로 가능한 한 빨리 프로그램을 만들려고하지 않고 단순히 배우는 것입니다. .

이미 제안했듯이 파이썬이 너무 느리면 파이썬 구현을 C 구현으로 항상 바꿀 수 있습니다. 그러나 이것은 거대한 프로젝트에서 아마 2-3 번 일어날 것이므로 C 언어로 시작하는 것은 선택한 언어가 아닌 한 시간 낭비 일 수 있습니다.


1
실제 수학 집약적 인 응용 프로그램을 작성하는 경우 해석 된 언어보다 성능이 크게 향상되어 C 또는 C ++ ( 'C / C ++'와 같은 것은 없음)를 거의 확실하게 선택합니다. 나는 2 년 전 Topcoder를 살펴 봤는데, 콘테스트가 누출과 같은 사소한 세부 사항에 신경 쓰지 않았기 때문에 메모리 유출 만 원했던 많은 C ++을 본 것을 기억합니다. 나는 감동하지 않았다.
Jim In Texas

정확히 내 요점. 우선 순위의 문제입니다. 커널은 메모리 누수를 해결하기 위해 메모리 누수를 신경 쓰지 않습니다. 시간을 절약한다면 나쁜 습관이나 반 패턴에 신경 쓰지 않습니다.
K.Steff

2
"그것이 작동되도록 : 귀하의 마지막 단락은 황금 규칙을 구현 한 후 빨리 만들을".
Carson63000

9

TopCoder의 오랜 회원이자 가끔 SPOJ 사용자 인 경우 경쟁에서 다른 언어보다 C / C ++를 선호하는 주요 이유는 원시 속도라고 말할 수 있습니다. 프로그램 실행 시간이 정해지면 알고리즘 코딩 측면에서 더 느슨해 지므로 얻을 수있는 "가장 빠른"언어를 선택해야한다는 엄청난 압박이 있습니다. TC에서의 진행은 Java에서 C #으로 C ++로 진행되었습니다.

그러나 이러한 상황은 일상적인 개발보다 경쟁에서 더 흔합니다. 최적의 코드를 작성하는 것이 보편적으로 중요하지만 가능한 한 빨리 코드를 완성하고 가능한 한 유지 관리 할 수있게하는 것이 상대적으로 중요합니다. 수백 개의 CPU 사이클. 파이썬으로 무언가를 코딩하는 것이 더 편하다면, 종종 선호되는 솔루션입니다.

또한 Python은 C ++에서는 사용할 수없는 고급 기능을 제공합니다. 그것들을 만드는 것은 종종 매우 비싸고 때로는 불가능합니다 (예를 들어, C ++에서 리플렉션 또는 자체 수정 코드 작성 고려). 그런 경우에는 더 높은 수준의 언어에 의존하는 것이 최적의 솔루션이 될 수도 있습니다.


TC 및 SPOJ의 사용자이므로 코드에 파이썬을 사용하면 시간과 단순성 사이의 절충이 매우 큰가? 즉, C를 사용하여 동일한 알고리즘을 성공적으로 제출할 수 있다면 파이썬을 사용하여 성공적으로 제출할 수 있습니까? (그렇습니다. 질문에 따라 크게 다를 수 있지만 대부분의 경우 또는 일부에 단점이 있습니까?)
ffledgling

@Ayos 나는 TC 또는 SPOJ의 맥락에서 그것을 사용하지 않았기 때문에 파이썬을 말할 수는 없지만 C #과 Java에 비해 C ++의 이점은 때때로 중요하며 심지어 그다지 중요하지 않습니다. C ++에서 C #으로 코딩 된 알고리즘의 간단한 포트가 시간 초과로 실패했지만 연습 실에있는 경우를 기억할 수 있습니다. 대부분의 경우 올바른 알고리즘을 찾는 것이 성공적인 제출과 실패한 제출 사이의 차이를 만드는 유일한 것입니다.
dasblinkenlight

1
Python, Ruby 및 Perl과 같은 해석 된 언어는 Java 및 C # (C와 비교하여 속도가 느림)과 같은 컴파일 된 고급 언어보다 몇 배 느리게 실행됩니다. 그러나 매우 큰 데이터 세트로 작업하거나 실시간 속도가 필요한 경우가 아니면 실제로 중요하지 않습니다.
KChaloux

5

CI에서 코드를 작성하기 위해 앉을 때마다 약 15 분 후에 포기합니다. 왜냐하면 너무 번거롭고 파이썬으로 이동하는 경향이 있기 때문입니다.

이러한 생산성 향상은 C 및 C ++ 작업이 크게 감소한 일반적인 이유입니다.

사용하기 쉽기 때문에 C보다 파이썬을 선호하는 특정 관행이 나 또는 다른 프로그래머 / 컴퓨터 과학자에게 장기적으로 영향을 미치는 방법에 대한 질문입니다.

여기에는 두 가지 핵심 부분이 있습니다. 첫 번째는 알고리즘 프로그래밍입니다. 알고리즘을 표현하는 데 사용하는 언어는 중요하지 않습니다. 알고리즘 자체를 다루고 올바른 문제를 올바른 문제에 맞추는 것이 핵심 부분이므로 실제 문제는 없습니다.

두 번째 부분은 생산성 향상입니다. 시간이 지남에 따라 생산성을 높이는 것을 사용하는 것은 좋은 습관이며, 경력을 쌓는 데 도움이 될뿐입니다. 알고리즘을 다른 언어로 표현할 수 있다는 것은 매우 도움이되지만, 그 언어가 반드시 사용하는 것은 아니며 언어가 사용하는 관용구에 대해 도움이됩니다.

간단히 말해 걱정하지 마십시오 . 알고리즘을 표현하는 데 사용하는 것이 전혀 표현할 수있는 것보다 훨씬 덜 중요합니다.


3
"C 및 C ++ 작업이 크게 줄었습니다." 응? 내가 반대 추세를 볼 때 이것은 파란색에서 벗어난 것처럼 보입니다. 해당 문장의 출처를 명시 할 때까지 -1.

3

Python 또는 Ruby와 같은 고급 언어를 사용하면 얻을 수있는 장점은 (1) 구문이 의사 코드에 매우 가깝고 (2) 표준 라이브러리가 유용한 데이터 구조를 즉시 제공한다는 것입니다 (배터리에는 @Robert가 언급 한 개념 포함). 따라서 사용하는 것을 선호하는 것이 좋습니다. 언어가 주류이거나 "차가운"언어를 선택하는 대신 생산성을 극대화하는 모든 것을 사용하십시오.


당신은 힙 스터 또는 무언가입니까? 여기 PBR이 있습니다. 나를? 차가워 요.
토마스 에딩

2

C / C ++보다 "고급"언어로 프로그래밍 할 때 컴퓨터에서 작동하는 방식을 배우고있을 때 빠질 것입니다. 임베디드 시스템, 운영 체제 및 하드웨어 드라이버와 같은 것을 개발할 수 없습니다. C를 아는 것도 어셈블러를 배울 때 도움이됩니다.

또한 모든 미션 크리티컬 시스템의 대부분은 여전히 ​​C로 개발되어 있으므로 여러 소프트웨어 소프트웨어 브랜치 (항공 우주 / 자동차 / 메드 테크 등)에서 작업하지 못할 수도 있습니다.


문제는 금속에 가까운 측면이 아니라 알고리즘에 관한 것이 었습니다.
Konrad Rudolph

글쎄, 하드웨어 드라이버 작성은 알고리즘과 매우 밀접한 관련이 있습니다. 예를 들어, 아날로그-디지털 변환기 용 드라이버를 작성할 때 디지털 필터와 일종의 대기열 또는 우선 순위 시스템을 개발해야합니다. 그런 다음 드라이버 위에 API를 추가하십시오. "객체"또는 "추상 데이터 유형"을 작성하는 것과 매우 유사합니다.

@Lundin 실제 시나리오의 단점을 언급 해 주셔서 감사합니다.
ffledgling

1

'Big O notation'에 대한 질문이 있고 그것을 측정하고 측정하려고하면 파이썬이 물건을 구현하는 방법에 대해 더 많이 알지 않는 한 Python에서 수행하기가 더 어려울 수 있습니다 (예 : Python 목록은 연결 목록이 아닙니다) ; 파이썬 정렬은 TimSort입니다. 파이썬 가비지는 특정 시간에 수집합니다 ...

나는 항상 C 프로그램을 프로세서에서 일어날 가능성이있는 것에 연결하는 것이 더 쉽다는 것을 알고 있지만 여기에서도 프로세서 캐싱이있다. OS의 타임 슬라이싱; 직관에 영향을 줄 수있는 컴파일러 최적화 등

파이썬 코드를 작성하고 디버깅하는 것이 더 빠르다는 것을 알았습니다. 따라서 선택권이 주어지면 파이썬에서 먼저 무언가를 얻는 데 집중합니다. 이 작동하는 Python 프로그램을 사용하면 더 큰 시스템에 슬롯을 넣을 수 있으며 작동했는지뿐만 아니라 속도가 빠르거나 속도가 느린 지 확인할 수 있습니다. 실제 성능 데이터를 얻으면 속도를 최적화 할 때 도움이되고 나중에 Python 또는 C 등에서 다시 작성하는 것에 대해 Python 버전을 테스트 할 수 있습니다.

따라서 파이썬 만 사용하는 단점은 프로세서 모델에 대한 C와 같은 컴파일을 기대하면서 작성된 알고리즘의 이점을 얻기가 어렵다는 것입니다. C 만 사용하면 다음과 같은 단점이 있습니다. 작성하고 디버깅하는 돼지이므로 자신의 라이브러리를 너무 자주 작성해야합니다.

나는 당신이 그들의 절충에 대해 느낄 때까지 두 언어 (및 다른 언어)를 사용하는 것이 가장 좋을 것이라고 생각합니다. 나 자신은 좋은 C 코더 였지만 이제는 여전히 작은 C 코드를 작성하지만 여전히 내 작업에서 C 코드를 읽고 (때로는 디버그해야 함)해야합니다. 나는 파이썬을 선호하지만 Perl과 Awk (그리고 sed와 grep과 sort, Tcl과 C와 ...)을 알고 사용합니다.


첫 단락에 동의하지 않습니다. 파이썬은 데이터 구조에 중점을두고 사전 정의 된 데이터 구조가 어떻게 구현되는지 명확하게 문서화합니다. 물론 가비지 수집은 런타임을 왜곡하지만 큰 O 순서는 거의 왜곡하지 않습니다.
Konrad Rudolph

1

Scala 또는 Clojure를 살펴 보라고 조언하지만 유형 주석을 사용하십시오. 어떤 경우에는 C만큼 빠를 수 있으며, 다른 경우에는 C / IMHO 와는 달리 매우 명쾌하고 명확한 표기법을 가지고 있지만 루비 / 파이썬보다 훨씬 빠릅니다 . 이것을 C 코드로 고려하십시오.

for (i <- 1 to 100; j <- 2 until 100;
     k <- 1 to 2; if i != j) {
     //...
}

또한 그들은 루비 / 파이썬의 유사 기능을 프로그래밍 아스날이 map, filter, reduce반복하는 또는 꼬리 호출 재귀 그러나 그 다음 아직 완전히 동적 스크립트 언어 훨씬 빠른만큼 빠르지 등.


1

업계에서 이러한 언어를 사용하거나 대규모 소프트웨어 / 라이브러리 등을 개발 한 사람들의 의견을 듣고 싶습니다.

나는 몇 년 동안 큰 C ++ 라이브러리의 작은 부분을 연구 했으며이 라이브러리의 맥락에서 학사 및 석사 학위 논문을 작성했습니다. 라이브러리는 우연히 생물 정보학 알고리즘 및 데이터 구조를위한 라이브러리입니다.

C ++는이 라이브러리의 특정 요구 사항과 일반적인 알고리즘 라이브러리에 거의 완벽하기 때문에 라이브러리는 C ++로 빌드됩니다. 다른 알고리즘 라이브러리를 개발하고 언어를 선택했다면 거의 확실하게 C ++을 다시 선택했을 것입니다.

그 이유는 단지 성능뿐만 아니라 모두가 당신에게 당신의 유형을 할 수있는 기능 제공의 우선 더 많은 종류의 안전과 초를주는 강력한 타입 시스템 문서화 에 사용되는 알고리즘을. 이것은 내 경험상 가독성과 유지 관리 성을 크게 향상시킬 수 있습니다.

즉, 간단한 알고리즘 낙서와 퍼즐의 경우 C ++에서 문제를 가장 잘 구성하는 방법을 구체적으로 시도하지 않는 한 거의 항상 Python을 사용합니다 (주로 의사 코드와 거의 비슷하기 때문에). 지금까지 많은 SPOJ 또는 TopCoder 문제를 해결하지 못했기 때문에 빠른 언어를 사용하는 것이 성능이 실제로 중요한지 여부는 알 수 없습니다.

그러나 일반적으로 중요한 것은 통과하기 위해 알고리즘을 올바르게 얻는 것 입니다. 이 경우 파이썬은 잘 작동합니다. 예를 들어, 시간이 맞지 않고 올바른 솔루션 만 계산되는 Project Euler 문제의 경우 Python이 완벽하게 적합합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.