2009-11-07 6 views
3

나는 파이썬에서 switch 문 대신 몇 가지 기사를 읽었다. 주로 if와 elif 's 대신에 dicts를 사용합니다. 그러나 아무도 정말로 질문에 답하지 않습니다. 더 나은 성능이나 효율성을 가진 것이 있습니까? 나는 if와 elif가 각 문장을 검사해야하고 if와 elif가 많은 경우 비효율적이된다는 몇 가지 주장을 읽었다. 그러나 dicts 사용하여 주위에 가져옵니다,하지만 당신은 어쨌든 성능 게인을 취소 호출하는 새 모듈을 만드는 데 결국. 결국 유일한 차이점은 가독성입니다.파이썬 대체 스위치의 성능 차이

누구든지 이에 대해 의견을 개진 할 수 있습니까? 실제로 장기적으로 어떤 차이가 있습니까? 누구든지 정기적으로 대안을 사용합니까? 나는 내가 30-40 elif/if와 아마도 더 많은 것을 미래에 가질 것이기 때문에 내가 묻는 유일한 이유가있다. 모든 입력을 부탁드립니다. 감사.

+2

성능에 대한 토론과 함께 몇 가지 훌륭한 제안이 있습니다. http://stackoverflow.com/questions/60208/replacements-for-switch-statement-in-python –

+1

"많은 if 및 elif의"You 실제로 이것에 대한 시간을 낭비하기 전에 실제로 측정 할 수있는 실제 증거를 제공해야합니다. 또한 유지 보수를 수행하는 사람들의 비용은 흔히 소프트웨어의 가장 비싼 부분입니다. 미래 프로그래머의 시간을 최적화하십시오. –

+0

이것에 대해 몇 가지 테스트를 수행했습니다. 저는 인터프리터를 작성 중이며 명령 실행을 위해 큰 if 문을 사용하는 것이 두 가지 주요 병목 중 하나입니다. – mdm

답변

3

모든 성능/프로파일 링 질문과 관련하여 정답은 "각자의 필요에 맞게 테스트하십시오."입니다.

위대한 도구 중 하나는 timeit이며 in the python docs에 대해 알아볼 수 있습니다.

일반적으로 다른 언어 대신 사전을 사용하는 것과 관련된 성능 문제가 발생하지 않았습니다. switch 문. 내 생각 엔 성능 비교는 대안 수에 따라 달라질 것입니다. 누가 하나가 다른 것보다 더 좋아지게되는 전환점이 있을지도 모른다.

귀하 (또는 다른 사람)가 테스트 한 경우 언제든지 결과를 게시하십시오.

6

코드의 효율성보다는 코드의 가독성과 유지 관리 가능성에 대해 관심을 기울여야합니다. 대부분의 시나리오, 특히 지금 설명하는 시나리오에 적용됩니다. 효율성 차이는 미미할 수 있습니다 (소량의 벤치마킹 코드로 쉽게 확인할 수 있음). 30-40 elif는 경고 기호입니다. 어쩌면 추상화되어 코드를 읽기 쉽게 만들 수 있습니다. 귀하의 사례를 설명하고 누군가가 더 나은 디자인을 제시 할 수 있습니다.

+0

질문에 대한 답변이 아닙니다. 다 방향 분기가 불가피하고 성능이 중요 할 때 (예 : 통역사) 많은 응용 프로그램이 있습니다. – mdm

0

키 조회에 하나의 해시 작업 만 필요하기 때문에 사전에 if 문 대신 대체 시퀀스를 사용하는 것이 좋습니다. 그렇지 않으면 소수의 경우에만 몇 개의 if 문장이 더 좋습니다. dict은 아마도 당신이하고있는 일에 대한보다 우아한 해결책 일 것입니다. 어느 쪽이든, 성능 차이는 실제로 눈에 띄지 않을 것입니다. dict로 조회 (1) 그들은 키가 형편 해싱와 사용자 코드 유형을 포함 희귀하고 실질적으로-관찰되지 않을 경우 (제외 O가 될 것입니다 때문에

8

dict의 perfomance는 일반적으로 매우 될 것입니다 ;-). 말하듯이 "임의의 호출 가능 모듈"을 만들 필요가 없습니다. 사전 작성을 위해 한 번 수행되는 작성은 이 아닙니다.은 특히 비용이 많이 듭니다. 작동 중에는 하나의 조회 만 수행되므로 하나의 호출, 기름칠 번개 시간.

다른 사람들도 제안했듯이 timeit을 사용해 몇 가지 마이크로 벤치 마크 벤치 마크를 시도해보십시오. 내 예측 : 당신은 당신이 언급대로, 당신이 이제까지 아무것도 하지만에게 callables의 DICT을 고려에 대한 당신의 이마를 때리고됩니다 플레이에 수십 가능성과 -)를 발견하면

하는 것은 너무 열심히 실행! 자신의 벤치 마크와 몇 가지 사양을 제공 할 수 있지만, 우리는 당신에게 대안을 벤치마킹 할 수 있다고 생각합니다. 그러나 도움을 요청하기 전에 직접 해보려한다면 정말 더 유익 할 것입니다!-)

1

여러 언어로 스위치를 사용하는 경우 파이썬에서 dict를 사용합니다. switch 문을 파이썬에 추가하면 (고려 되었기 때문에) 어쨌든 실제 성능을 얻을 수 없습니다.

dicts는 Python에서 보편적으로 사용됩니다. CPython dicts는 매우 효율적이고 강력한 해시 테이블 구현입니다. 조회는 O (n) 인 elif 체인을 통과하는 것과는 대조적으로 O (1)입니다. (30-40은 아마도 어쨌든이 문제를 처리하기에 충분할만큼 큰 자격이 없을 것입니다.) 호출 할 새 모듈을 만드는 것이 무슨 뜻인지 잘 모르겠지만 dicts를 사용하는 것은 확장 성이 뛰어나고 쉽습니다.

실제 성능 향상에 대해서는 실제로는 효과적으로 추상화 할 수 없습니다. 코드를 가장 간단하고 유지하기 쉬운 방법으로 작성하십시오 (파이썬 forgoshake를 사용하고 있습니다!) 그리고 너무 느린 지 확인하십시오. 그렇다면 프로필을 작성하고 진정한 차이를 만들기 위해 어떤 장소에서 속도를 높여야하는지 확인하십시오.

0

몇 가지 벤치 마크를 수행했습니다 (here 참조). 키가 순차적 인 정수인 경우 함수 포인터 목록을 사용하는 것이 가장 빠릅니다. 일반적인 경우 : Alex Martelli가 맞습니다. 사전이 가장 빠릅니다.