2011-04-21 5 views
1

나는 Python 3.2를 읽었으며, 3.1보다 많은 개선이 있음을 이해한다. 그러나 3.2에서 실행되는 제로 수정을 사용하는 똑같은 코드는 3.1.3에서 코드를 실행할 때보 다 10 배 이상 느립니다.Python 3.2가 Python 3.1.x와 비교할 때 매우 느리다.

파일의 이진 내용을 물리적 장치로 전송하는 데 6 분이 걸렸습니다. 동일한 PC에서 똑같은 시나리오가 파이썬 3.1.3으로 실행하는 데 30 초 밖에 걸리지 않을 때 수신 된 데이터를 화면에 출력합니다.

나는 처음부터 내 코드를 Python 3.1.2에서 개발했으며 코드의 20 %는 ctypes를 사용하여 USB/PCI 장치가있는 Windows 드라이버를 통해 트랜잭션을 수행하므로이 성능 저하가 뒤로 이동하는 것과 관련이 없다고 생각합니다 적합성. 내 응용 프로그램에서는 스레딩의 네 가지 인스턴스를 만듭니다. 스레드 하위 클래스는 각각 시스템의 PCI 또는 USB 장치 하나를 처리합니다. 내가 의심하는 것은 3.2의 ctypes 성능이 그 어느 때보 다 악화되었거나 내가 원하는 멀티 스레딩 성능을 정확하게 얻기 위해 스레딩해야하는 스레드가 더 많다는 것입니다. 누구나 나를 위해 약간의 빛을 그늘지게 할 수 있으면 많이 감사 할 것입니다.

================ =======

더 diagopnistic

I이 시스템 자원 모니터 화면에 나타낸 바와 같이 & 파이썬 3.1.3 comelete 3 초를 소비

를받은 전송되는 데이터의 양을 감소

http://img62.imageshack.us/img62/5313/python313.png

python 3.2는 다음과 같이 완료되는 데 약 1 분이 소요됩니다. 시스템 리소스 모니터 스크린 샷 http://img197.imageshack.us/img197/8366/python32.png

내 PC는 2GB RAM이있는 단일 코어 Intel P4이므로 여러 코어 프로세서에 대해 GIL 팩터를 배제 할 수 있다고 생각합니다.

필자는 yappi를 사용하여 3.1.3과 3.2 모두에서 성능 결과를 평균화하기 위해 다중 실행을 프로파일 링했습니다. 스레드 및 ctypes가 파이썬 3.2에서 잘못 수행 된 것을 볼 수 있습니다.

파이썬 패키지의 표준 윈도우 바이너리

on 3.1.3 
name         #n  tsub  ttot  tavg 
C:\Python31\lib\queue.py.qsize:86 46070 1.352867 4.234082 0.000092 
C:\Python31\lib\queue.py._get:225 8305  0.012457 0.017030 0.000002 
C:\Python31\lib\queue.py.get:167  8305  0.635926 1.681601 0.000202 
C:\Python31\lib\queue.py._put:221 8305  0.016156 0.020717 0.000002 
C:\Python31\lib\queue.py.put:124  8305  0.095320 1.138560 0.000137 

on 3.2 
name         #n  tsub  ttot  tavg 
C:\Python32\lib\queue.py.qsize:86 252168 4.987339 15.229308 0.000060 
C:\Python32\lib\queue.py._get:225 8305  0.030431 0.035152 0.000004 
C:\Python32\lib\queue.py.get:167  8305  0.303126 7.898754 0.000951 
C:\Python32\lib\queue.py._put:221 8305  0.015728 0.020928 0.000003 
C:\Python32\lib\queue.py.put:124  8305  0.143086 0.431970 0.000052 

실이 많다는 성능을 제공하는이 액세스하는 스레드 안전 큐는 미친 듯이 나쁜

또 다른 예 파이썬 3.2입니다. 이 기능은 단순히하는 ctypes 모듈을 통해 윈도우 USB 드라이버의 API를 호출하고 USB 장치

on 3.1.3 
name         #n  tsub  ttot  tavg 
..ckUSBInterface.py.read_register:14 1  0.000421 0.000431 0.000431 
on 3.2 
name         #n  tsub  ttot  tavg 
..ckUSBInterface.py.read_register:14 1  0.015637 0.015651 0.015651 

당신이 볼 수있는 데이터의 16 개 비트를 요청, 걸리는 시간은

파이썬 3.2보다 30 배 더 나쁘다 파이썬 3.2는 내 응용 프로그램에 대한 재앙처럼 보입니다.

+0

이것이 무엇인지 추적 했습니까? 파이썬에서 회귀가 될 수도 있지만, 언어의 동작이 바뀌지는 않을 것으로 보이지만, 이것이 사실 일 수 있는지주의 깊게 살펴보아야합니다. –

+0

모든 컴퓨터에서 Python 3.2를 제거하고 3.1.3 – SCM

답변

2

이것이 분명해야 할 이유가 없습니다. 이 추가 시간이 필요한 부분을 정확하게 보려면 앱을 프로파일 링해야합니다.

+0

을 다시 설치하면 화면에 출력되는 내용이 실시간으로 출력됩니다.내 코드가 데이터를 수신하자마자 윈도우 드라이버를받는 모든 데이터 블록을 출력합니다. PYthon 3.2에서 출력물이 인쇄 될 때마다 화면의 모든 이진 문자를 읽을 수있을 정도로 느리다. 파이썬 3.1.3에서는 인쇄가 너무 빨라서 데이터를 인쇄하는 동안 화면에서 아무 것도 읽을 수 없습니다. 이는 중요한 성능 차이이며 엄청난 것입니다. 3.1에서 30 초, 3.2에서 6 분을 생각하십시오. 나는 GIL이 3.1에서 3.2로 향상되었다고 생각했다 ... – SCM

+0

@SCM : 아하, 매우 흥미 롭다. 이 추가 시간이 필요한 부분을 정확하게 보려면 앱을 프로파일 링해야합니다. –

+0

Python 3.2와 Python 3.1.3 사이의 비교를 위해 다중 스레드 응용 프로그램에서 yappi 프로파일 링을 편집하고 게시했습니다. 그 결과는 놀랍게도 파이썬 3.2에 나쁜 영향을 미친다. – SCM

관련 문제