필자는 파이썬 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
"범위"에 문제가있을 수 있습니까? "xrange"와 같은 코드 조각을 사용해 보셨습니까? –
'wheel_helper'는 무엇을합니까? – BrenBarn
파이썬 2.X에서는 범위를 반복 할 때'xrange'를 사용하십시오. 2.X에서는'range'는 새로운'list' 객체를 만들고'xrange'는'generator'를 반환합니다. 파이썬 3.X에서'xrange'는'range'를 대체합니다. – Benproductions1