PYQT - 帮助分析python代码{内置方法exec_}

时间:2014-10-08 21:11:23

标签: python pyqt profiling show profiler

我在PyQt中开发一个软件来编辑游戏中的瓷砖地图 - 它支持我游戏专有的许多东西。

我的游戏主要是小地图,但我想尝试做一个更大的地图 - 但不幸的是,我的编辑似乎在较大的地图上(特别是在创作时)很迟钝。编辑器中的每个图块都是带有图像的标签。所以我在它上面做了一个90x90的地图,并使用python配置文件来理解是什么让它失效。

python -m cProfile Editor.py > profile.log

总时间超过一秒的行数如下:

ncalls  tottime percall cumtime percall filename:lineno(function)   
8205    22.397  0.003   22.397  0.003   {built-in   method  show}
1       5.09    5.09    37.913  37.913  {built-in   method  exec_}
1       1.824   1.824   1.824   1.824   {getExistingDirectory}      
1       1.038   1.038   1.038   1.038   {question}      

好的,所以getExistingDirectory需要花时间选择目录,所以我将其排除在外。

结果显示被称为8205次!因为地图上有8100个瓷砖,我认为这与它有关 - 我制作了一个90x90的地图,即8100个瓷砖。同时,屏幕上还有其他控件,甚至还有117个元素的调色板 - 所有其他控件至少可以总共200个小部件。

因此,单击新文件后,将创建中央窗口小部件中的切片。我的问题是,是否有一个消息,以便显示,而不是每个标签小部件被调用一次,只为他们在里面的更大的小部件调用一次?

更新

事实证明,我在创建每个人时都会给自己打电话。我删除了电话!不幸的是,时间过去了。

ncalls tottime percall cumtime percall filename:lineno(function)
1      43.588  43.588  53.901  53.901  {built-in method exec_}     
1      2.325   2.325   2.325   2.325   {getExistingDirectory}       
1      1.447   1.447   1.447   1.447   {question}       
2      0.265   0.132   1.773   0.887   Editor.py:59(DrawMap)       
8452   0.244   0       0.244   0       {built-in method scaled}     
8442   0.227   0       1.233   0       TileXtra.py:319(initTile)       
24852  0.221   0       0.221   0       {built-in method connect}     
42260  0.128   0       0.128   0       {PIL._imaging.alpha_composite}       
42260  0.077   0       0.115   0       Image.py:472(_new)       
8452   0.077   0       0.24    0       ImageQt.py:44(__init__)       
8452   0.074   0       0.074   0       {fromImage}       
42260  0.072   0       0.403   0       Image.py:2033(alpha_composite)       
1      0.064   0.064   54.158  54.158  Editor.py:3(<module>)       
8452   0.042   0       0.042   0       {method 'encode' of 'ImagingEncoder' objects}   
8452   0.038   0       0.132   0       Image.py:530(tobytes)       
67740  0.036   0       0.05    0       Image.py:628(load)       
24852  0.033   0       0.033   0       {PyQt4.QtCore.SIGNAL}       
42664  0.03    0       0.03    0       Image.py:461(__init__)       

1 个答案:

答案 0 :(得分:1)

确定找到解决方案。

在具有多个小部件的窗口小部件的绘制方法中,将其隐藏,然后使用QWidget.setVisible (self, bool visible)在pyqt中显示,如:

class BigWidget(QWidget):
    def __init__(self, parent=None, **kwargs):
        QWidget.__init__(self, parent, **kwargs)

        ...

    def DrawManyWidgets(self, parent):
        self.setVisible(False)

        ...

        self.setVisible(True)