2017-09-10 2 views
1

내가 발명 한 보드 게임을위한 게임 엔진을 파이썬에서 번역하기 시작했습니다. 내가 보여줄 예제는 무의미하다는 것을 알고 있습니다. 실제로 그것을 최적화 할 필요는 없지만, 무거운 기능을 다루기 전에이 권리를 얻고 싶습니다.최적의 성능을 위해 줄리아에서 타입 선언이 얼마나 자주 필요합니까?

function howMany()::Int8 
    pieces::Int8 = 0 
    while pieces > 8 || pieces < 4 
     try 
      print("How many pieces are we going to play with (min 4, max 8)? ") 
      pieces = parse(Int8, readline(STDIN)) 
     catch 
      println("It must be an integer number between 4 and 8!") 
     end 
    end 
    return pieces 
end 

function main() 
    pieces::Int8 = howMany() 
    #println(pieces, typeof(pieces)) 
end 

main() 

Int8 (3 선언 + 구문 분석 매개 변수)를 선언해야합니까? 성능 저하없이 Int8을 지정하지 않아도되는 경우는 언제입니까?

+1

@DanGetz가 훌륭한 답을 제공합니다. 나는 개인적으로 타입 정보를 함수 시그니처에 포함하는 것을 선호한다고 생각했다. 예를 들어'myfunc (x :: Float64) :: Int', *와 같이 보통 타입 안정 코드를 얻기 위해 그렇게 할 필요는 없지만 *. 그 이유는 6 개월 후에 다시 돌아와서 코드를보고 더 쉽게 디버깅 관점에서 삶을 더 쉽게 만들 수 있다는 것입니다 (즉, 잘못된 유형을 함수를 변경하거나 실수로 잘못된 형식을 출력 함) –

답변

4

는 두 번 다음에 비싼 try-catch 피할 수있는 :

function howMany() 
    while true 
     print("How many pieces are we going to play with (min 4, max 8)? ") 
     pieces = get(tryparse(Int8, readline(STDIN)), Int8(0)) 
     4 <= pieces <= 8 && return pieces 
     println("It must be an integer number between 4 and 8!") 
    end 
end 

function main() 
    pieces = howMany() 
    println(pieces, typeof(pieces)) 
end 

main() 

같은 좋은 지름길을 사용 : 기본

  • 단락 && 대신 부피와

    • getif ... end.

    그리고 코드 안정 @code_warntype howMany() 방송 같다.

  • +0

    감사! 그래서, 함수가 항상 같은 타입의 값을 반환하기 때문에,':: Int8'을'pieces' (두 번) 나'howMany()'(성능면에서)에 추가 할 필요가 없다는 것을 말합니까? 말하기)? – Pigna

    +1

    정확합니다. 컴파일 된 후에는 모든 것이 입력된다는 점을 기억하는 것이 좋습니다. 따라서 타입을 남겨두면 컴파일러는 그것들에 대해 생각해보아야하고, Julia의 타입 유추는'howMany()'가 Int8을 반환하고'pieces = someInt8','pieces'가 Int8임을 알만큼 알맞다. –