2015-11-20 5 views
7

Ich benutze Python Pyglet-Modul (Python 3 unter Windows). Wenn ich auf irgendwelche Klassen in pyglet.image verweise, springt die CPU-Nutzung von python hoch und fällt erst, wenn ich Python verlasse. Zum Beispiel:Warum verursacht der Verweis auf eine Klasse in (python) pyglet.image schwere CPU-Last unter Windows?

Microsoft Windows [Version 6.1.7601] 
Copyright (c) 2009 Microsoft Corporation. All rights reserved. 
C:\Anaconda3>python.exe 
Python 3.4.3 |Anaconda 2.3.0 (64-bit)| (default, Mar 6 2015, 12:06:10) [MSC v.1 
600 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import pyglet #No problem! 
>>> pyglet.image.ImageData #Heavy CPU load until I exit python 
<class 'pyglet.image.ImageData'> 

Ist dieses erwartete Verhalten? Warum führt die Erwähnung dieser Klasse (nicht einmal die Instantiierung) zu einer so hohen CPU-Auslastung?

Systeme die ich getestet habe:

  • Windows 7 Desktop mit Anaconda Python 3.4.3 und Pyglet installiert durch 'Pyglet installieren pip': Hohe CPU-Auslastung (mein Problem)

  • Der gleiche Win7-Desktop mit Anaconda Python 3.4.3, aber pyglet installiert durch 'pip installieren hg + https://bitbucket.org/pyglet/pyglet': Hohe CPU-Auslastung.

  • Derselbe Win7-Desktop mit python 3.5 von python.org und pyglet installiert über 'pip install pyglet': Hohe CPU-Auslastung.

  • Fedora 22 Lenovo Laptop mit Python 3.4.2 und pyglet 1.2.1 installiert durch dnf: kein Problem.

  • Windows 10 HP Laptop mit Anaconda Python 3.4 und Pyglet installiert durch 'Pip installieren Pyglet': kein Problem.

Ist es möglich, dass dies Hardware-abhängig ist?

+1

Sie könnten versuchen, es zu profilieren: https://docs.python.org/3.5/library/profile.html – Nathaniel

+1

Erhalten Sie eine Traceback, wenn Sie Ctrl-C drücken? – shx2

+0

Der Eingang, der zu einer hohen CPU-Auslastung führt, kehrt sofort zurück. Wenn ich Strg-C, bekomme ich keine Rückverfolgung. – Andrew

Antwort

2

Es vermutlich auf die folgenden Zeilen auf dem module verwandt ist:

# Initialise default codecs 
from pyglet.image import codecs as _codecs 
_codecs.add_default_image_codecs() 

Die Reihenfolge für das Laden der Standard codecs ist:

# Add the codecs we know about. These should be listed in order of 
# preference. This is called automatically by pyglet.image. 

# Compressed texture in DDS format 
try: 
    from pyglet.image.codecs import dds 
    add_encoders(dds) 
    add_decoders(dds) 
except ImportError: 
    pass 

# Mac OS X default: QuickTime 
(...) 

# Windows XP default: GDI+ 
(...) 

# Linux default: GdkPixbuf 2.0 
(...) 

# Fallback: PIL 
(...) 

# Fallback: PNG loader (slow) 
(...) 

# Fallback: BMP loader (slow) 
(...) 

Wegen verzögertes Laden pyglet.image nur, wenn Sie beziehen sich geladen zu etwas, und Sie verwenden wahrscheinlich einen der langsamen Fallbacks. Wenn das der Fall ist, können Sie vielleicht versuchen, die Codecs zu installieren/zu deinstallieren, so dass Sie eins nach dem anderen verwenden und herausfinden, ob das Problem tatsächlich bei den Codecs liegt. Wenn Sie Ihre Versionen dieser Codecs veröffentlichen, können Sie das Problem möglicherweise reproduzieren.

+0

Danke für einen Blick! Ich werde das bis morgen nicht überprüfen können, aber das ist produktiv, also bekommst du das Kopfgeld. – Andrew