2013-09-03 4 views
0

그것은 offtopic 질문처럼 보일지 모르지만, 나는 올바른 방법 (또는 효율적인 방법을 말하는 것이 더 좋다)에 대해 궁금해하고 있습니다.Python 프로그래밍의 효율적인 방법

웹 응용 프로그램이 있고 사전 키가 특정 값을 갖고 있는지 (또는 어떤 객체 속성 검사에도 적용될 수 있는지) 확인해야하는 함수 안에 있다고 가정 해 보겠습니다. 다음 중 어느 것이 더 효율적입니까 (메모리 또는 속도)? 그 이유는 무엇입니까? 또는 이것이 잘못된 방법 일 경우, 왜 그럴까요?

if myDictionary.get("xy") == "defined value": 
    runSomeFunction(myDictionary.get("xy")) 

또는

myVar = myDictonary.get("xy", "") 
if myVar == "defined value": 
    runSomeFunction(myVar) 
이 우리가이 코드에 접근하는 방법에서보다 다양한 논의 될 수있다

- (분당 요청 수백) 웹 응용 프로그램에서 또는 최적으로 정상적인 스크립트 프로그래밍 방식.

미리 의견을 보내 주셔서 감사합니다.

+0

얼마나 비싸지 만 .get ("xy")가 무엇이고 다음을 위해 최적화하고 싶은가 : CPU, 메모리 I/O ... – RickyA

+0

메모리 측면에서 보면 거의 동일합니다. 참조 된 객체는 한 번뿐입니다 두 경우 모두 메모리에 저장됩니다. 유일한 차이점은 임시 변수가 사용하는 메모리이며 그다지 중요하지 않습니다. – ThiefMaster

+0

@ThiefMaster 감사합니다. 함수 호출보다 임시 변수를 작성하는 것과 같이 호출 할 수 있다면 메모리 오버 헤드가 있는지 궁금합니다. – koressak

답변

4

이러한 종류의 미세 최적화가 관련되어 있으면 스크립팅 언어를 사용하는 것이 잘못된 기술 선택입니다. 따라서 일반적인 "벤치마킹"외에 유일한 적절한 대답은 다음과 같습니다. 실제로 중요하지 않습니다. 코드를 읽을 수있게하십시오.

더 많은 기술적 인 설명 : dict은 해시 맵을 사용하여 구현됩니다. 즉, O(1) 조회가 있습니다. 따라서 요소에 액세스하는 것은 매우 빠릅니다. 내 생각 엔 임시 변수는 키의 해시 계산을 두 번 포함하지 않으므로 조금 빠릅니다.

  • 0.3209540843963623 (더 임시 VAR)
  • 0.3401560783386230 (임시 VAR)

그래서 임시 변수를 사용하는 것이 사실입니다 :

100 만 반복이있는 timeit 벤치 마크는 다음과 같은 시간을 보여줍니다 약간 느린. 그러나 이것은 1M 번의 반복 작업에 해당합니다. 그래서 매회 실제 평균 차이는 0.00000002 초에 불과했습니다. 그것은 아무것도 아니며 단지 나의 초기 점을 증명합니다. 최적화 할 필요가없는 것들을 마이크로 최적화하지 마십시오. 코드를 대신 읽을 수있게하십시오.

+0

글쎄, 그것은 O (1)보다 실제로는 중요하지 않습니다 :) 그리고 우리가 객체 getter를 가지고 객체의 속성을 얻는다면 (정수, 문자열 등과 같은 단순한 유형으로 잘라 보겠습니다.) .) – koressak

+0

@ThiefMaster 사전 조회가 매우 빠르다는 것은 사실이지만, OP의 코드에서 사용되는'get()'은 함수 호출이며 일반적으로 Python에서는 빠르지 않습니다. –

1

왜 내가 get() dict의 방법을 사용하는지 잘 모르겠습니다. 이 방법은 키가 있는지 여부를 모르는 경우에 사용해야합니다. 키의 존재 여부를 언급하지 않았습니다. 그래서 나는 왜 당신이하지 않는지 궁금합니다.

if myDictionary["xy"] == "defined value": 
    ... 

스타일 메모 : 일반적으로 CamelCasing은 클래스 이름에만 사용됩니다. 더 많은 Pythonic 이름은 my_dictionaryrun_some_function이 될 것입니다.

사전 조회가 빠릅니다. 애플리케이션을 벤치마킹하여 병목 현상이 발생하는지 확인하십시오. 코드를 알지 못하더라도 거의 확실하지 않습니다. 파이썬은 내부적으로 거의 모든 것을 사전으로 사용합니다.이 특정 사전 액세스로 인해 성능 문제가 발생할 가능성은 거의 없습니다.

+0

그냥 dict라고 부르기 때문에 그것이 dict이라는 것을 의미하지는 않습니다. Qu :) – RickyA

관련 문제