Python虽然循环CPU要求

Python虽然循环CPU要求

问题描述:

我不想打扰人们在这里与一个简单的问题,也告诉我GOOGLE了信息,但我想从面临相同的人得到意见。据说python中的循环放慢了(http://wiki.python.org/moin/WhileLoop)。我有一个只使用一个循环的脚本,但这非常重要,实际上它确实会减慢速度。我的第一个程序是使用100%的CPU(双核!!!)。我在循环中引入了sleep()函数,并且CPU使用率降低到了50%。我不能只是继续增加睡眠时间,实际上我想减少它。无论如何,是否有任何'技巧'使这个while循环更快?Python虽然循环CPU要求

(条件是一个按钮是否被按下与否上PyQt4中的用户界面生成)

+0

单线程程序在物理上不可能使用100%的两个内核。其他人正在使用第二个核心。 – 2013-02-19 16:00:30

+0

我同意。无论如何,很显然,这个主要的while循环正在破坏我的CPU使用率。 – user2061878 2013-02-19 16:21:54

你链接到所述参考是误导性的。两个样本之间的速度差异将会很小,并且如果循环内部正在进行任何实际工作,通常不会引人注目。

这是任何循环,它将使用其分配的时间100%,直到它完成的性质。无论循环是高效的还是非常低效的都没关系。解决此问题的唯一方法是调用一些使其等待的操作系统功能,例如您尝试的sleep

现代OS GUI是事件驱动的原因是为了不必在一个循环中等待事件 - 您调用一个函数来等待消息,并且操作系统将CPU给予其他人直到消息到达。有了像Qt这样的框架,它将被埋在所谓的消息循环中,并且您需要提供适当的框架钩子以将事件路由到您自己的函数。

我会研究你给我的信息。但是为了保持这里的讨论是代码的一部分正在放缓:

while self.startButton.isChecked(): 
    self.widget.canvas.ax2.clear()             
    self.widget.canvas.ax2.set_xlabel('Sensor #') 
    self.widget.canvas.ax2.set_yscale('log', basey = 10)         
    self.widget.canvas.ax2.set_xlim(0, num_sensors + 1) 
    self.widget.canvas.ax2.set_xticks(range(1, num_sensors + 1)) 
    self.widget.canvas.ax2.set_xticklabels(sensorLabel, fontsize = 10) 
    measure, read_s = [], []      
    t = round((time() - initialTime), 1)   
    for i in range(num_sensors): 
     read = self.ser.readline().strip() 
     measure.append(read) 
     read = float(read) 
     read_s.append(read) 
     self.widget.canvas.ax.plot(t, read, plot_array[i]) 
    self.widget.canvas.ax2.scatter(range(1, num_sensors + 1), read_s, c = log10(read_s), s = 100) 
    self.widget.canvas.ax2.set_ylim(bottom = .8 * min(read_s))        
    f.write(str(t) + '\t' + '\t'.join(measure) + '\n') 
    self.widget.canvas.ax.legend(loc = 'center left', bbox_to_anchor = (2.2, 0.5), ncol = 1, fontsize = 10) 
    self.widget.canvas.draw()              
    QtCore.QCoreApplication.processEvents()        
    sleep(.5) # HERE IS THE SLEEP INTRODUCED 
else: 
    global last_read  
    last_read = measure 
    self.statusbar.showMessage('Idle') 
    f.close()   
    self.ser.write('C') 
    try:       
     for i in range(1000): 
      self.ser.timeout = .1 
      a = self.ser.readline() 
      self.statusbar.showMessage('Deleting reads in the serial buffer') 
      if a == 'Last': 
       break 
    except: 
     self.ser.close() 

的GUI运行良好(使用不到2%的CPU),直到我调用这部分代码,当我按下startButton(保持检查,直到我再次按下它)。

+0

只是为了更新线程。我运行更新到我的Ubuntu Linux,现在完全相同的程序占CPU使用率的〜38%。谢谢Mark的帮助。 – user2061878 2013-02-20 16:01:50