因为对c++一直处于差不多能看的懂代码,但写的话一头包,所以毅然采用pyqt编写一个股票行情软件。部分窗体截取如下:
等大体上快完工了,跑着跑着突然发现,界面卡顿的一笔。一看cpu,飚到了十几。瞅瞅人家的行情软件,那cpu使用都是稳定的在2以下。
行情一频繁就尿裤,难道是py太拉胯了?
于是立马使用cProfile:
python -m cProfile -s cumulative main.py
1.一号锅:拉胯的setStyleSheet
首先发现setStyleSheet这个函数耗时太久,单发调用居然要5ms,而股票嘛,有红有绿,这调用又非常频繁,故而这肯定是一个瓶颈。 网上搜索了一下,setStyleSheet会触发上级组件的重绘,所以性能上无比拉胯。
不用setStyleSheet修改文字颜色,那就用别的方案。有用palette的,我试了下,毫无效果,并且又注意到官方说不保证palette在所有平台上都一致,所以palette作废。
另外,还可以给QLabel设置html代替纯文本,于是简单撸了以下工具函数
def set_label_text_with_style(label, text, style):
label.setText(f"<div style='{style}'>{text}</div>")
对代码进行全局替换。
再一跑,似乎cpu调用下降了,但还是8左右,也不能100%确定这到底有没有起到性能上的优化作用。
于是继续查看下cProfile的输出结果,终于发现了罪魁祸首:QListWidget
2.二号锅:无比拉胯的QListWidget
QListWidget这兄弟,如果数据变化不频繁的话,那还是很能罩的住场子的,譬如什么好友列表,音乐播放列表。但是碰到高速行情,就不行了。大量的ListItem的添加,删除,QListWidget的性能就开始跟不上了。
于是继续网上搜索,又说用QListView的,但是那文档实在是稀烂,而且有各种各样的api。我不就是显示个行情,几个数字而已,何必搞那么复杂。还是自己撸个类似的