1

我正在尝试确定我的 python 代码的哪些部分运行最慢,以便我更好地了解我需要修复的内容。我最近发现了非常有用的cProfilegprof2dot 。我的问题是我没有看到有关我用作回调的函数的任何信息,我相信这些函数可能运行得非常缓慢。根据我从这个答案中了解到的情况,cProfile 默认情况下只能在主线程中工作,我猜回调使用单独的线程。如果您使用线程库,该答案显示了一种让事情正常工作的方法,但我无法让它适用于我的情况。

这大致是我的代码的样子:

import rospy
import cv
import cProfile
from numpy import *
from collections import deque

class Bla():
  def __init__( self ):
    self.image_data = deque()
    self.do_some_stuff()
  def vis_callback( self, data ):
    cv_im = self.bridge.imgmsg_to_cv( data, "mono8" )
    im = asarray( cv_im )
    self.play_with_data( im )
    self.image_data.append( im )
  def run( self ):
    rospy.init_node( 'bla', anonymous=True )
    sub_vis = rospy.Subscriber('navbot/camera/image',Image,self.vis_callback)
    while not rospy.is_shutdown():
      if len( self.image_data ) > 0:
        im = self.image_data.popleft()
        self.do_some_things( im )

def main():
  bla = Bla()
  bla.run()

if __name__ == "__main__":
  cProfile.run( 'main()', 'pstats.out' ) # this could go here, or just run python with -m cProfile
  #main()

关于如何获取 vis_callback 函数的 cProfile 信息的任何想法?通过修改脚本本身,甚至更好地使用python -m cProfile或其他命令行方法?

我猜这是读取图像或将它们附加到缓慢的队列中。我的直觉是,将它们存储在队列中是一件可怕的事情,但我需要用 matplotlib 显示它们,如果它不在主线程中,它会拒绝工作,所以我想看看损坏到底有多严重有这个解决方法

4

0 回答 0