2014-07-15 2 views
2

필자는 파이썬 2.7 코드를 가지고 있으며 모든 * nix 유형 시스템에서 훌륭하게 작동합니다. 그러나 Windows에서는 동일한 코드 섹션에서 실행 시간이 크게 달라집니다. 아래에 디버그 결과를 기록하십시오. t는 각 패스의 총 시간이고, s는 데이터를 생성하는 시간이고, u는 직렬로 데이터를 직렬로 장치에 보내는 시간입니다 (모두 밀리 초).Windows에서 일관성없는 파이썬 성능

t: 9 - s: 3 - u: 6 
t: 14 - s: 9 - u: 5 
t: 9 - s: 3 - u: 6 
t: 9 - s: 3 - u: 6 
t: 15 - s: 8 - u: 7 
t: 14 - s: 9 - u: 5 
t: 11 - s: 5 - u: 6 
t: 15 - s: 9 - u: 6 
t: 14 - s: 9 - u: 5 
t: 13 - s: 8 - u: 5 
t: 15 - s: 9 - u: 6 
t: 15 - s: 9 - u: 6 
t: 14 - s: 8 - u: 6 
t: 11 - s: 6 - u: 5 
t: 11 - s: 5 - u: 6 
t: 15 - s: 8 - u: 7 
t: 15 - s: 10 - u: 5 
t: 7 - s: 2 - u: 5 
t: 15 - s: 9 - u: 6 
t: 15 - s: 9 - u: 6 
t: 13 - s: 7 - u: 6 
t: 12 - s: 7 - u: 5 
t: 12 - s: 6 - u: 6 
t: 15 - s: 9 - u: 6 
t: 8 - s: 2 - u: 6 
t: 14 - s: 9 - u: 5 
t: 15 - s: 9 - u: 6 
t: 14 - s: 9 - u: 5 
t: 15 - s: 9 - u: 6 
t: 14 - s: 8 - u: 6 
t: 14 - s: 9 - u: 5 
t: 14 - s: 9 - u: 5 
t: 9 - s: 4 - u: 5 
t: 11 - s: 5 - u: 6 

직렬 전송 시간은 문제가되지 않으며 일반적으로 매우 일관됩니다. 2 초에서 9 밀리 초 동안 어디서나 문제가되는 데이터를 실제로 생성하는 "s"단계입니다. 엄청난 스윙! 데비안에서는 (심지어 나무 딸기 파이를 돌리는)이 부분은 매우 일관된 11-12ms를 필요로합니다. 다른이의 주위에 코드 만 "의"시간 표시 단계의 많은있다

은 기본적으로 이것이다 :

buf = [wheel_helper(self._vector[y][x], h, s) for y in range(h) for x in range(w)] 
    buf = [i for sub in buf for i in sub] 
    self._led.setBuffer(buf) 

그것은 색상의 거리를 기반으로하는 매트릭스에 무지개 패턴을 ​​생성 센터. 하지만 모두입니다. 마다 시간입니다. 왜 그렇게 격렬하게 변해야하는지에 대한 이유는 없습니다.

의견이 있으십니까?

업데이트 : "s"단계에서 실행중인 코드는 일반적으로 무시할 수 있습니다. 이것은 의 한 예일뿐입니다. 모두 매우 가변적 인 시간 동안 실행됩니다. 일부는 범위를 사용하고 일부는 사용하지 않습니다. 그것은 전면적이지만 항상 문제입니다.

업데이트 2 :

좋아, 좀 더 테스트를했고, 매우 간단하고 하지 사용 범위를 수행하는 예를했다! 그것은 fibonacci 시퀀스의 처음 1000 개 요소를 1000 번 계산합니다. 아주 간단하고 맞습니까? 그러나 Windows에서 가장 빠른 실행과 가장 느린 실행의 차이는 375 % 가까이 길어집니다 (아래 예제 출력에서는 최대/최소). 모든 타이밍 값은 밀리 초입니다.

import time 
import math 
min = 10 
max = 0 
avg = 0 
sum = 0 
count = 0 
def msec(): 
    return time.clock() * 1000.0 

def doTime(start): 
    global min 
    global max 
    global avg 
    global sum 
    global count 
    diff = msec() - start 
    if diff < min: min = diff 
    if diff > max: max = diff 
    sum += diff 
    avg = sum/count 
    print "Curr {:.3f} | Min {:.3f} | Max {:.3f} | Max/Min {:.3f} | Avg {:.3f}".format(diff, min, max, max/min, avg) 



h = 24 
w = 24 
while count < 1000: 
    start = msec() 

    #calculate the first 1000 numbers in the fibonacci sequence 
    x = 0 
    while x < 1000: 
     a = int(((((1 + math.sqrt(5))/2) ** x) - (((1 - math.sqrt(5))/2) ** (x)))/math.sqrt(5)) 
     x+=1 

    count+=1 
    doTime(start) 

Mac은 면역 상태가 아니지만 가장 느린 동작은 75 % 더 오래 걸립니다. Linux에서 실행하려고했지만 마이크로 초 타이밍 해상도를 수행하지 않으므로 숫자가 가장 가까운 ms에 잘못 표시됩니다.

Windows: Curr 2.658 | Min 2.535 | Max 9.524 | Max/Min 3.757 | Avg 3.156 

Mac: Curr 1.590 | Min 1.470 | Max 2.577 | Max/Min 1.753 | Avg 1.554 
+1

"범위"에 문제가있을 수 있습니까? "xrange"와 같은 코드 조각을 사용해 보셨습니까? –

+0

'wheel_helper'는 무엇을합니까? – BrenBarn

+0

파이썬 2.X에서는 범위를 반복 할 때'xrange'를 사용하십시오. 2.X에서는'range'는 새로운'list' 객체를 만들고'xrange'는'generator'를 반환합니다. 파이썬 3.X에서'xrange'는'range'를 대체합니다. – Benproductions1

답변

0

나는 그것이 인해 범위 믿습니다. 파이썬 (2.X)의 이전 버전은이 목적으로 범위 xrange을 모두 가지고 있습니다. 그러나 xrange가 xrange 범위이 때문에 비효율적 전체 목록을 (생성한다 (즉, 그것은 발전기를 반환) 필요한 경우에만 목록을 생성 범위 때문에보다 효율적이다, 당신은 1에서 목록이 있다고 가정 100000)

따라서 목록 크기가 커지면 범위을 사용하면 처리 속도가 느려질 수 있습니다.

+0

위의 업데이트 된 질문에 유의하십시오. 범위를 사용하지 않을 때에도 발생합니다. –

+0

또한 ... 왜 xrange 범위가 동일하게 변경하는 데 걸리는 시간을 만드나요? 나는 느린 것을 볼 수 있었지만, 실행 시간은 5의 인자로 변화했다. ??? –

+0

새로운 테스트 코드로 업데이트 됨 ... no range : –

0

아무런 문제가 보이지 않습니다. 직렬 IO를 수행하는 코드가있어 프로세스를 차단하고 가능하면 스케줄러를 호출합니다. 그런 일이 발생하면 먼저 다른 프로세스에 제어 권한을 부여하고 해당 프로세스가 타임 라인을 초과하거나 초과하면 프로세스를 다시 예약합니다.

당신의 질문은 : 실행중인 시스템의 스케줄러 타임 슬라이스의 크기는 얼마입니까? 나는 이것이 당신에게 무슨 일이 일어나고 있는지에 대한 통찰력을 줄 것이라고 믿습니다.

+0

그는 "2 초에서 9 밀리 초 동안 어디서나 문제가되는 데이터를 실제로 생성하는 단계가 있습니까?"라는 질문에 언급되어 있습니다. Don "범위"가 목록 생성과 관련이 있다고 생각합니까? 우리가 목록의 크기를 모르는 것처럼, 그것은 그것의 bcoz 수 없습니다? –

+0

아마 ...하지만 직렬 출력 부분은 실제로 일정합니다. "s"의 타이밍은 그 부분에만 해당됩니다. 목록은 다양합니다. 12 일 수도 있고 2000 일 수도 있습니다.이 특별한 경우에는 576입니다. –

+0

새 테스트 코드로 업데이트했습니다. 범위 없음 :) –